如何在SQL Server中获取触发器的定义(正文)?

时间:2008-09-04 15:46:08

标签: sql-server triggers metadata

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

感谢。


谢谢,皮特,我不知道这件事!

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

我的解决方案是在网站上删除一个ASPX页面,作为一种“架构服务”,将收集的元数据作为XML返回。我设置了一个小的AJAX应用程序,可以将任意数量的目录实例与主数据库进行比较并显示差异。这不是完美的,但对我来说是一大进步。

再次感谢!

6 个答案:

答案 0 :(得分:22)

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

syscomments视图中的text列还包含用于创建对象的sql。

答案 1 :(得分:16)

对于2005年和2008年,您可以使用OBJECT_DEFINITION()功能

答案 2 :(得分:15)

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

答案 3 :(得分: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' 

答案 4 :(得分:1)

您可以通过多种方式查看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';

答案 5 :(得分:0)

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

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'