【问题标题】:How do I list (or export) the code for all triggers in a database?如何列出(或导出)数据库中所有触发器的代码?
【发布时间】:2011-06-28 14:07:06
【问题描述】:

我正在将我们数据库中的本地时间更改为 UTC 时间。
有很多触发器可以将信息复制到当前使用 GETDATE() 的历史表中。

我想在数据库中找到每个使用GETDATE()(而不是GETUTCDATE())的触发器,有什么方法可以自动执行此操作吗?

我已经通过select * from sys.triggers 列出了它们,但我还需要查看实际代码才能找到GETDATE() 的用途。

【问题讨论】:

    标签: sql-server triggers


    【解决方案1】:

    您可以尝试以下方法:

    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'
    

    【讨论】:

    • 谢谢!正是我想要的!
    • 理想情况下,您可以为它们生成脚本,就像为表和存储过程等生成脚本一样,但这很有效。谢谢;)
    【解决方案2】:

    这是我用来导出触发器的脚本:

    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/

    【讨论】:

    • 欢迎来到 Stack Overflow!虽然该链接可能会解释您的答案,但it would be preferable 在此处包含对您的答案的解释的基本部分,并提供链接以供参考。
    【解决方案3】:

    如果你想从数据库中导出所有触发器...这里有一些代码:

    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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-08
      • 1970-01-01
      • 2017-05-05
      • 2022-08-03
      • 1970-01-01
      • 2010-10-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多