2011-06-28 1771 views
9

Estoy cambiando la hora local a hora UTC en nuestra base de datos.
Hay una gran cantidad de desencadenantes que copia información a las tablas de historial que actualmente usa GETDATE().¿Cómo enumero (o exporto) el código para todos los desencadenantes en una base de datos?

Me gustaría encontrar cada activador que usa GETDATE() (en lugar de GETUTCDATE()) en la base de datos, ¿hay alguna manera de hacerlo automáticamente?

Los he enumerado por select * from sys.triggers pero también necesito ver el código real para poder encontrar el uso de GETDATE().

Respuesta

18

Su podría intentar lo siguiente:

SELECT  o.[name], 
      c.[text] 
FROM  sys.objects AS o 
INNER JOIN sys.syscomments AS c 
ON  o.object_id = c.id 
WHERE o.[type] = 'TR' 
+1

Gracias! ¡Justo lo que estaba buscando! –

+0

Idealmente, usted podría generar scripts para ellos como puede para tablas y procedimientos almacenados, etc., pero esto funciona. Gracias;) – Chiramisu

0

Si desea exportar todos los disparadores de la base de datos ... aquí hay algo de código:

DECLARE @vchServerName VARCHAR(500) 
DECLARE @vchDBName  VARCHAR(500) 

DECLARE @intLoop  INTEGER 
DECLARE @intTotalRows INTEGER 

DECLARE @intId   INTEGER 
DECLARE @vchName  VARCHAR(500) 
DECLARE @vchSQL   VARCHAR(4000) 

-- supress count (just so log looks nicer!) 
SET NOCOUNT ON 

-- get current DB and server 
SET @vchDBName = DB_NAME() 
SET @vchServerName = @@servername 

-- get list of XXX 
SELECT ROW_NUMBER() OVER (ORDER BY o.object_id) fldRowNum 
    ,o.object_id fldId 
    ,s.name + '.' + o.name   fldName 
INTO #tblFound 
FROM sys.objects o 
    INNER JOIN sys.schemas s ON o.schema_id = s.schema_id 
WHERE [type] = 'TR' 
SET @intTotalRows = @@ROWCOUNT 
SET @intLoop = 1 


-- loop thru list 
WHILE @intLoop <= @intTotalRows 
BEGIN 
    SELECT @intID = fldId 
     ,@vchName = fldName 
    FROM #tblFound 
    WHERE fldRowNum = @intLoop 

    PRINT 'Exporting ' + @vchName + '...' 

    -- NOTE: I'm using a version of bcp that doens't have -D parameter so I need to use DB name here 
    SET @vchSQL = 'SELECT c.[text] FROM ' + @vchDBName + '.sys.syscomments AS c WHERE c.id = ' + CONVERT(VARCHAR,@intID) 
    SET @vchSQL = 'bcp "' + @vchSQL + '" queryout "c:\temp\' + @vchName + '.sql" -c -t -T -S ' + @vchServerName 

    EXEC master..XP_CMDSHELL @vchSQL 

    SET @intLoop = @intLoop + 1 
END 

DROP TABLE #tblFound 

PRINT 'Done' 
1

Aquí está la escritura que utilicé para exportar desencadenantes:

DECLARE @t VARCHAR (MAX) 
SET @t = '' 
SELECT @t = @t + 'IF EXISTS (SELECT 1 FROM sys.triggers WHERE object_id = OBJECT_ID(N''' + s.name + '.' + o.name +''')) 
DROP TRIGGER ' + s.name + '.' + o.name + ' 
GO 
' + OBJECT_DEFINITION (OBJECT_ID(s.name + '.' + o.name)) +' 
GO 
' 
FROM sys.objects o 
INNER JOIN sys.schemas s ON o.schema_id = s.schema_id 
INNER JOIN sys.objects o2 ON o.parent_object_id = o2.object_id 
WHERE o. [type] = 'TR' 
AND (
OBJECTPROPERTY (o.object_id , 'ExecIsInsertTrigger') = 1 
OR 
OBJECTPROPERTY (o.object_id , 'ExecIsUpdateTrigger') = 1 
OR 
OBJECTPROPERTY (o.object_id , 'ExecIsDeleteTrigger') = 1 
) 
SELECT @t AS [processing-instruction(x)] FOR XML PATH ('') 

Más detalles aquí si no tiene sentido para nadie:

http://paulfentonsql.co.uk/2015/09/01/generate-createdrop-statements-for-all-triggers-of-a-given-type/

+0

¡Bienvenido a Stack Overflow! Si bien el enlace puede explicar su respuesta, [sería preferible] (// meta.stackoverflow.com/q/8259) incluir aquí las partes esenciales de la explicación de su respuesta y proporcionar el enlace de referencia. – SuperBiasedMan

Cuestiones relacionadas