我正在寻找最便携的方法来检查MS SQL Server中是否存在触发器.它至少需要处理SQL Server 2000,2005,最好是2008年.
信息似乎不在INFORMATION_SCHEMA中,但如果它在某处,我宁愿从那里使用它.
我知道这个方法:
if exists ( select * from dbo.sysobjects where name = 'MyTrigger' and OBJECTPROPERTY(id, 'IsTrigger') = 1 ) begin end
但我不确定它是否适用于所有SQL Server版本.
还有首选的"sys.triggers"目录视图:
select * from sys.triggers where name = 'MyTrigger'
或调用sp_Helptrigger存储过程:
exec sp_helptrigger 'MyTableName'
但除此之外,我猜是关于它的:-)
渣
更新(Jakub Januszkiewicz):
如果您需要包含架构信息,您还可以执行以下操作:
SELECT (list of columns) FROM sys.triggers tr INNER JOIN sys.tables t ON tr.parent_id = t.object_id WHERE t.schema_id = SCHEMA_ID('dbo') -- or whatever you need
这适用于SQL Server 2000及更高版本
IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') = 1 BEGIN ... END
请注意,天真的反转不能可靠地工作:
-- This doesn't work for checking for absense IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') <> 1 BEGIN ... END
...因为如果对象根本不存在,则OBJECTPROPERTY
返回NULL
,并且NULL
(当然)不是<> 1
(或其他任何东西).
在SQL Server 2005或更高版本上,您可以使用它COALESCE
来处理它,但是如果您需要支持SQL Server 2000,则必须构造语句来处理三个可能的返回值:( NULL
该对象不存在于所有),0
(它存在但不是触发器),或1
(它是一个触发器).
假设它是DML触发器:
IF OBJECT_ID('your_trigger', 'TR') IS NOT NULL BEGIN PRINT 'Trigger exists' END ELSE BEGIN PRINT 'Trigger does not exist' END
对于其他类型的对象(表,视图,键,等等......),请参阅:"类型"下的http://msdn.microsoft.com/en-us/library/ms190324.aspx.