无法找到满足我需求的SQL diff工具,我正在编写自己的工具。在INFORMATION_SCHEMA和sys表之间,我有一个大部分完整的工作版本。但是我在元数据中找不到的一件事是触发器的定义,你知道,实际的SQL代码。我忽略了什么吗?
感谢。
谢谢,皮特,我不知道这件事!
斯科特,我正在使用非常基本的托管软件包,不允许远程连接到数据库。我不知道RedGate的规格(我无论如何都买不起)是否提供了解决方法,虽然还有API(例如来自Apex的API),我没有看到投资一个仍然需要我更多编程的解决方案。 :)我的解决方案是在网站上删除一个ASPX页面,作为一种“架构服务”,将收集的元数据作为XML返回。我设置了一个小的AJAX应用程序,可以将任意数量的目录实例与主数据库进行比较并显示差异。这不是完美的,但对我来说是一大进步。
再次感谢!
答案 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'