26

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

谢谢。


谢谢,皮特,我不知道!

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

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

再次感谢!

4

6 回答 6

26

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

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

于 2008-09-04T15:50:34.193 回答
18
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>'
于 2015-02-03T17:45:53.847 回答
17

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

于 2008-09-04T15:53:57.210 回答
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' 
于 2017-03-24T11:52:57.083 回答
2

您可以通过多种方式查看 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';
于 2019-12-10T11:15:44.070 回答
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'
于 2018-01-30T06:27:14.270 回答