Corrección de problemas de permisos al mover la base de datos de MSDB entre distintas instancias

Este artículo le ayuda a resolver los problemas de permisos que se producen al mover la base de datos de MSDB entre distintas instancias.

Versión original del producto: Microsoft SQL Server
Número de KB original: 2000274

Síntomas

Imagine la siguiente situación:

La base de datos msdb se mueve de una instancia a otra mediante el proceso de copia de seguridad y restauración o copiando los archivos de base de datos (mdf y ldf). A continuación, en el servidor de destino, un usuario que no forma parte del rol fijo Sysadmin en SQL Server intenta realizar cualquiera de las siguientes operaciones:

  • Vea un trabajo en SQL Server Management Studio.
  • Llame a procedimientos almacenados relacionados con el agente SQL (por ejemplo, xp_sqlagent_enum_jobs o sp_get_composite_job_info) directamente mediante T-SQL.

En este escenario, el usuario recibirá un mensaje de error similar al siguiente:

Se produjo una excepción al ejecutar una instrucción o lote de Transact-SQL. (Microsoft.SqlServer.ConnectionInfo)
Se denegó el permiso EXECUTE en el objeto "xp_sqlagent_enum_jobs", la base de datos "mssqlsystemresource", el esquema "sys". (Microsoft SQL Server, Error: 229)

Causa

Este problema se produce porque el certificado del Agente SQL es diferente en instancias diferentes.

Solución

Para resolver el problema, debe reemplazar el certificado del patrón por el certificado de la base de datos msdb restaurada mediante el siguiente script en el servidor de destino:

use msdb
go
-- Backup the Agent certificate from the remote server to a file
BACKUP CERTIFICATE [##MS_AgentSigningCertificate##] TO FILE = 'MS_AgentSigningCertificate.remote_server.cer'
go
use master
go
-- re-create the agent certificate on master
-- Note: Because we are making these changes using a regular user and not as part of setup, the name
-- cannot include the ## token.
-- Creating a regular certificate in this case should be the equivalent as we only need it to derive a SID
 CREATE CERTIFICATE [MS_AgentSigningCertificate.remote_server] FROM FILE = 'MS_AgentSigningCertificate.remote_server.cer'
go
-- Recreate the user mapped to the cert and grant the same permissions that the regular certificate needs.
CREATE USER [MS_AgentSigningCertificate.remote_server] FROM CERTIFICATE [MS_AgentSigningCertificate.remote_server]
go
GRANT EXECUTE TO [MS_AgentSigningCertificate.remote_server]
go

Nota:

En un escenario en el que los certificados en el patrón y el modelo son los mismos antes de ejecutar el script descrito en el artículo, la ejecución del script da como resultado el siguiente mensaje de error:

Msg 15232, Level 16, State 1, Line 7
Ya existe un certificado con el nombre "MS_AgentSigningCertificate.remote_server20009" o este certificado ya se ha agregado a la base de datos.

Si experimenta los síntomas descritos en el artículo incluso cuando los certificados son los mismos, póngase en contacto con los Servicios de soporte al cliente (CSS) de Microsoft para obtener más ayuda.