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

31

无法找到符合我的需求的SQL差异工具,因此我正在编写自己的工具。通过INFORMATION_SCHEMA和sys表,我有了一个基本完整的工作版本。但是元数据中找不到触发器定义的内容,也就是实际的SQL代码。我有遗漏吗?

谢谢。


谢谢,Pete,我不知道那个!

Scott,我使用的是非常基本的主机套餐,不允许远程连接到数据库。从RedGate的规格说明(我也买不起)中,我不知道它们是否提供了解决方案,虽然还有一些API(例如来自Apex的API),但我认为投资于这样的解决方案还需要更多的编程。 :)

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

再次感谢!


继Pete所写的内容之后,sp_helptext非常有用,可以显示任何触发器、视图、存储过程、函数等背后的SQL。 - matt b
6个回答

28

sp_helptext可以用来获取组成触发器的SQL语句。

syscomments视图中的text列也包含了用于对象创建的SQL语句。


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

1
注意 - syscomments 中的 text 字段是 nvarchar(4000) 类型,因此这将截断任何大于 4k 字符的触发器。如果可能的话,最好使用 OBJECT_DEFINITION(id) - KyleMit
1
@KyleMit - 是的,但是当触发器更长时,将会有下一个记录与续集。虽然不是非常方便,但对于手动检查已经足够了。 - Tomasz Gandor

18

2
2005年至2012年的工作-https://msdn.microsoft.com/zh-cn/library/ms176090(v=sql.110).aspx - Milan
这使得搜索引用其他对象的对象变得非常容易,甚至可以进行更复杂的查询,例如“哪些存储过程执行了对表X的插入”。 - Michael Bray

7

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

3

您有多种查看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';

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'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接