¡Hola, chicos!
Vamos por otro artículo.

Introducción

Que trabaja como DBA en entornos donde los desarrolladores y analistas de BI del banco no son administradores de sistemas (amén), sino que crean puestos de trabajo en el banco utilizando sus propios usuarios (SQL Server: comprensión de los permisos y roles del Agente SQL (SQLAgentUserRole, SQLAgentReaderRole y SQLAgentOperatorRole)), sabe lo comunes que son las demandas para cambiar la titularidad del trabajo, especialmente cuando un usuario deja la empresa y su trabajo necesita ser transferido a la responsabilidad de otra persona.

Basado en este escenario, me gustaría compartir con ustedes cómo cambiar el propietario de un trabajo del Agente SQL de una manera práctica, sencilla y rápida, tanto para un trabajo específico como para todos los trabajos propiedad de un usuario.

Cómo identificar al propietario de los trabajos del Agente SQL Server

Para comenzar este artículo, demostraré rápidamente cómo identificar el propietario de los trabajos del Agente SQL Server utilizando una consulta T-SQL simple, donde será posible enumerar todos los trabajos en la instancia y sus respectivos propietarios:

SELECT 
    A.job_id,
    A.[name] AS job_name,
    B.[name] AS [user_name],
    B.[sid]
FROM
    msdb.dbo.sysjobs A
    LEFT JOIN sys.server_principals B ON A.owner_sid = B.[sid]

Ejemplo:

Cómo cambiar el propietario de un trabajo con SSMS o Azure Data Studio

La forma más sencilla y sencilla de cambiar el propietario de un trabajo es utilizar la interfaz de SQL Server Management Studio (SSMS).

O utilice la interfaz de Azure Data Studio (también conocida como Estudio de operaciones SQL)

Cómo cambiar el propietario de un trabajo con sp_update_job

La forma más sencilla de cambiar el propietario de un trabajo utilizando scripts T-SQL es mediante el procedimiento almacenado del sistema, msdb.dbo.sp_update_job, que le permite cambiar varias configuraciones para un trabajo determinado, incluido el propietario del trabajo.

Cambiar el propietario de un trabajo a partir del nombre del trabajo

EXEC msdb.dbo.sp_update_job 
    @job_name = 'Teste de Job', -- sysname
    @owner_login_name = 'sa' -- sysname

Cambiar el propietario de un trabajo según el ID del trabajo

EXEC msdb.dbo.sp_update_job 
    @job_id = 'FEC4CB2F-A39D-4FCA-8594-9388348C5C65', -- sysname
    @owner_login_name = 'sa' -- sysname

Cómo transferir trabajos entre inicios de sesión con sp_update_job

Cuando necesitas transferir la propiedad de trabajos de un usuario a otro, esta tarea puede resultar un poco engorrosa. Para ayudarle en esta tarea, preparé un script para realizar esta operación por usted.

DECLARE 
    @CmdUpdateJob VARCHAR(MAX) = '',
    @LoginOrigem VARCHAR(100) = 'dirceu.resende',
    @LoginDestino VARCHAR(100) = 'sa'


SELECT @CmdUpdateJob += '
EXEC msdb.dbo.sp_update_job @job_id = ''' + CAST(A.job_id AS VARCHAR(50)) + ''', @owner_login_name = ''' + @LoginDestino + ''';'
FROM
    msdb.dbo.sysjobs A
    JOIN sys.server_principals B ON A.owner_sid = B.[sid]
WHERE
    B.[name] = @LoginOrigem


EXEC(@CmdUpdateJob)

Ejemplo de ejecución de script:

Cómo transferir trabajos entre inicios de sesión con sp_manage_jobs_by_login

Como vimos anteriormente, en un escenario en el que es necesario transferir inicios de sesión de un usuario a otro, podemos usar el script anterior para hacerlo manualmente, usando el procedimiento almacenado sp_update_job. Sin embargo, a partir de SQL Server 2008 podemos utilizar otro sp del sistema, el sp_manage_jobs_by_login, que le permite transferir trabajos de un propietario a otro con una sola ejecución.

EXEC msdb.dbo.sp_manage_jobs_by_login
    @action = N'REASSIGN',  
    @current_owner_login_name = N'dirceu.resende',  
    @new_owner_login_name = N'sa';

Resultado de la ejecución:

Cómo cambiar el propietario de todos los trabajos

Y finalmente, si desea cambiar el propietario de todos los trabajos en su instancia, puede usar manualmente sp_update_job para aplicar este cambio a su entorno con el siguiente script:

DECLARE 
    @CmdUpdateJob VARCHAR(MAX) = '',
    @LoginDestino VARCHAR(100) = 'sa'


SELECT @CmdUpdateJob += '
EXEC msdb.dbo.sp_update_job @job_id = ''' + CAST(A.job_id AS VARCHAR(50)) + ''', @owner_login_name = ''' + @LoginDestino + ''';'
FROM
    msdb.dbo.sysjobs A


EXEC(@CmdUpdateJob)

Bueno chicos, espero que les haya gustado este artículo y que les sea útil en su vida diaria.
¡Un abrazo grande y hasta la próxima!