【问题标题】:How can I get the definition (body) of a trigger in SQL Server?如何在 SQL Server 中获取触发器的定义(主体)?
【发布时间】:2010-09-07 19:49:41
【问题描述】:

找不到满足我需求的 SQL diff 工具,我正在编写自己的。在 INFORMATION_SCHEMA 和 sys 表之间,我有一个基本完整的工作版本。但是我在元数据中找不到的一件事是触发器的定义,你知道,实际的 SQL 代码。我是否忽略了什么?

谢谢。


谢谢,Pete,我不知道!

Scott,我正在使用不允许远程连接到数据库的非常基本的托管包。我不知道 RedGate 的规格(无论如何我买不起)他们是否提供了解决方法,虽然那里也有 API(例如来自 Apex 的 API),但我没有看到投资一个仍然需要我进行更多编程的解决方案。 :)

我的解决方案是在站点上放置一个充当“模式服务”的 ASPX 页面,将收集的元数据作为 XML 返回。我设置了一个小 AJAX 应用程序,它将任意数量的目录实例与主实例进行比较并显示差异。这并不完美,但对我来说是向前迈出的重要一步。

再次感谢!

【问题讨论】:

标签: sql-server triggers metadata


【解决方案1】:

sp_helptext 用于获取构成触发器的 sql。

syscmets 视图中的文本列还包含用于创建对象的 sql。

【讨论】:

    【解决方案2】:

    对于 2005 和 2008,您可以使用 OBJECT_DEFINITION() 函数

    【讨论】:

    【解决方案3】:
    SELECT     
        DB_NAME() AS DataBaseName,                  
        dbo.SysObjects.Name AS TriggerName,
        dbo.sysComments.Text AS SqlContent
    FROM 
        dbo.SysObjects INNER JOIN 
            dbo.sysComments ON 
            dbo.SysObjects.ID = dbo.sysComments.ID
    WHERE   
        (dbo.SysObjects.xType = 'TR') 
        AND 
        dbo.SysObjects.Name = '<YourTriggerName>'
    

    【讨论】:

    • 注意 - syscomments 中的 text 字段的类型为 nvarchar(4000),因此这将修剪任何大于 4k 字符的触发器。如果有可能,可能值得使用OBJECT_DEFINITION(id)
    • @KyleMit - 是的,但是当触发器更长时,会有下一条记录继续。不是很方便,但足以手动检查。
    【解决方案4】:

    为了扩展 SQLMenace 的答案,这里有一个简单的查询,用于从数据库中返回所有触发器及其定义:

    SELECT 
        sysobjects.name AS trigger_name, 
        OBJECT_NAME(parent_obj) AS table_name,
        OBJECT_DEFINITION(id) AS trigger_definition
    FROM sysobjects 
    WHERE sysobjects.type = 'TR' 
    

    【讨论】:

      【解决方案5】:

      此查询返回触发器及其名称和正文。

      Select 
          [tgr].[name] as [trigger name], 
          [tbl].[name] as [table name] , 
          OBJECT_DEFINITION(tgr.id) body
      
          from sysobjects tgr 
      
          join sysobjects tbl
          on tgr.parent_obj = tbl.id
      
      WHERE tgr.xtype = 'TR'
      

      【讨论】:

        【解决方案6】:

        您可以通过多种方式查看 SQL Server 触发器定义。

        系统视图查询:

        SELECT definition
        FROM sys.sql_modules
        WHERE object_id = OBJECT_ID('trigger_name');
        

        或者

        SELECT OBJECT_NAME(parent_obj) [table name], 
           NAME [triger name], 
           OBJECT_DEFINITION(id) body
        FROM sysobjects
        WHERE xtype = 'TR'
          AND name = 'trigger_name';
        

        使用OBJECT_DEFINITION函数定义:

        SELECT OBJECT_DEFINITION(OBJECT_ID('trigger_name')) AS trigger_definition;
        

        使用sp_helptext存储过程定义:

        EXEC sp_helptext 
         'trigger_name';
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 2020-07-24
          • 1970-01-01
          • 2013-10-06
          • 2016-08-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多