domingo, 3 de mayo de 2009

Forzar activación de Database Mail en el agente de SQL Server

En alguna ocasión me ha ocurrido que no he podido activar en el sistema de alertas del agente de SQL, el perfil de correo Database Mail. Sea como sea, por mas que le pinchaba sobre Database Mail, siempre me activaba SQLMail.

Untitled

Para esas situaciones en las que el Management studio no quiere reaccionar, podemos hacerlo nosotros manualmente mediante el siguiente código T-SQL:

 

USE [msdb]
GO
EXEC msdb.dbo.sp_set_sqlagent_properties @email_save_in_sent_folder=1
GO
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
N'UseDatabaseMail',
N'REG_DWORD', 1
GO
EXEC master.dbo.xp_instance_regwrite N'HKEY_LOCAL_MACHINE',
N'SOFTWARE\Microsoft\MSSQLServer\SQLServerAgent',
N'DatabaseMailProfile',
N'REG_SZ',
N'solid'
GO



En este caso, donde pone “solid” pondremos el perfil Database Mail que queramos utilizar.

Solución al problema de tareas de mantenimiento fantasma

Un error que ocurría con las primeras ediciones de SQL 2005 para mi sorpresa parece que ha vuelto con SP3, me refiero a aquellos planes de mantenimiento corruptos que eran imposibles de borrar una vez los editabas en SQL Server Management Studio.

Recientemente en una instalación de W2K3 y SQL2K5 (ambos con todos los service packs instalados y actualizaciones de seguridad a la última en Abril 2009) he visto como ocurrian de nuevo los problemas con las tareas de mantenimiento:

The DELETE statement conflicted with the REFERENCE constraint
"FK_subplan_job_id". The conflict occurred in database "msdb", table
"dbo.sysmaintplan_subplans", column 'job_id'.
The statement has been terminated. (Microsoft SQL Server, Error: 547)

El error en cuestión se encuentra en uno de los procedimientos almacenados que se utilizan para borrar los jobs que genera el plan de mantenimiento para cumplir su función.

Existe solución al problema y consiste en la siguiente:

  • En la BBDD msdb, editar el código del procedimiento almacenado: dbo.sp_delete_job
  • Buscar el siguiente delete:
DELETE FROM msdb.dbo.sysjobs
WHERE job_id IN (SELECT job_id FROM #temp_jobs_to_delete)
  • Insertar el siguiente código justo delante:
DELETE FROM sysmaintplan_log
where subplan_id in (select subplan_id from msdb.dbo.sysmaintplan_subplans
where job_id in (SELECT job_id FROM #temp_jobs_to_delete))

DELETE FROM msdb.dbo.sysmaintplan_subplans
where job_id in (SELECT job_id FROM #temp_jobs_to_delete)
  • Ejecutar

Como podeis imaginar, por error no se han incluido dos referencias a tablas con información sobre los planes de mantenimiento a los que pertenece el job a eliminar y surge un error de clave ajena al intentar suprimirlo.

El problema lo he detectado con una instalación en cluster 2 nodos de Windows 2003 x64 Enterprise en ingles con SQL 2005 x64 Enterprise Castellano.