首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >检查SQL Server中是否存在触发器的最便携方法是什么?

检查SQL Server中是否存在触发器的最便携方法是什么?
EN

Stack Overflow用户
提问于 2009-03-11 21:26:54
回答 9查看 73.8K关注 0票数 49

我正在寻找最便携的方法来检查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版本。

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 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返回NULLNULL (当然)不是<> 1 (或其他任何值)。

在SQL Server2005或更高版本上,可以使用COALESCE来处理这一问题,但如果需要支持SQL Server2000,则必须构造语句以处理三种可能的返回值:NULL (该对象根本不存在)、0 (它存在但不是触发器)或1 (它是触发器)。

票数 34
EN

Stack Overflow用户

发布于 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
票数 63
EN

Stack Overflow用户

发布于 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‘。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/636452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档