Corregir problemas de permisos al mover la base de datos MSDB entre distintas instancias

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

Versión original del producto:   Microsoft SQL Server
Número 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 sobre los archivos de base de datos (mdf e 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:

  • Ver un trabajo en SQL Server management studio.
  • Llame SQL procedimientos almacenados relacionados con el agente (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 transact-SQL o lote. (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 SQL agente es diferente en distintas instancias.

Solución

Para resolver el problema, debe reemplazar el certificado en el 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 del patrón y el modelo son los mismos antes de ejecutar el script que se describe 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 analizados en el artículo incluso cuando los certificados son los mismos, póngase en contacto con el Servicio de soporte al cliente (CSS) de Microsoft para obtener más ayuda.