我正在寻找最便携的方法来检查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版本。
发布于 2010-08-05 22:40:19
这适用于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
如果对象根本不存在,则返回...because,OBJECTPROPERTY
返回NULL
,NULL
(当然)不是<> 1
(或其他任何值)。
在SQL Server2005或更高版本上,可以使用COALESCE
来处理这一问题,但如果需要支持SQL Server2000,则必须构造语句以处理三种可能的返回值:NULL
(该对象根本不存在)、0
(它存在但不是触发器)或1
(它是触发器)。
发布于 2009-03-11 21:33:47
还有一个首选的"sys.triggers“目录视图:
select * from sys.triggers where name = 'MyTrigger'
或者调用sp_Helptrigger存储过程:
exec sp_helptrigger 'MyTableName'
但除此之外,我猜就是这样了:-)
Marc
更新( 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
发布于 2011-11-13 07:27:36
假设它是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 under 'type‘。
https://stackoverflow.com/questions/636452
复制相似问题