Как мне перечислить (или экспортировать) код для всех триггеров в базе данных? - PullRequest
9 голосов
/ 28 июня 2011

Я перехожу с местного времени на UTC в нашей базе данных.
Есть много триггеров, которые копируют информацию в таблицы истории, которые в настоящее время используют GETDATE().

Я хотел бы найти в базе данных каждый триггер, который использует GETDATE() (вместо GETUTCDATE()), есть ли способ сделать это автоматически?

Я перечислил их по select * from sys.triggers, но мне также нужно увидеть фактический код, чтобы найти применение GETDATE().

Ответы [ 3 ]

19 голосов
/ 28 июня 2011

Вы можете попробовать следующее:

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 голос
/ 07 сентября 2015

Вот скрипт, который я использовал для экспорта триггеров:

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 ('')

Подробнее здесь, если это ни для кого не имеет смысла:

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

0 голосов
/ 11 декабря 2013

Если вы хотите экспортировать все триггеры из базы данных ... вот код:

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...