Blo*_*ard 48 sql-server triggers information-schema
我正在寻找最便携的方法来检查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
Run Code Online (Sandbox Code Playgroud)
但我不确定它是否适用于所有SQL Server版本.
mar*_*c_s 60
还有首选的"sys.triggers"目录视图:
select * from sys.triggers where name = 'MyTrigger'
Run Code Online (Sandbox Code Playgroud)
或调用sp_Helptrigger存储过程:
exec sp_helptrigger 'MyTableName'
Run Code Online (Sandbox Code Playgroud)
但除此之外,我猜是关于它的:-)
渣
更新(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
Run Code Online (Sandbox Code Playgroud)
wqw*_*wqw 34
这适用于SQL Server 2000及更高版本
IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') = 1
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
请注意,天真的反转不能可靠地工作:
-- This doesn't work for checking for absense
IF OBJECTPROPERTY(OBJECT_ID('{your_trigger}'), 'IsTrigger') <> 1
BEGIN
...
END
Run Code Online (Sandbox Code Playgroud)
...因为如果对象根本不存在,则OBJECTPROPERTY返回NULL,并且NULL(当然)不是<> 1(或其他任何东西).
在SQL Server 2005或更高版本上,您可以使用它COALESCE来处理它,但是如果您需要支持SQL Server 2000,则必须构造语句来处理三个可能的返回值:( NULL该对象不存在于所有),0(它存在但不是触发器),或1(它是一个触发器).
小智 9
假设它是DML触发器:
IF OBJECT_ID('your_trigger', 'TR') IS NOT NULL
BEGIN
PRINT 'Trigger exists'
END
ELSE
BEGIN
PRINT 'Trigger does not exist'
END
Run Code Online (Sandbox Code Playgroud)
对于其他类型的对象(表,视图,键,等等......),请参阅:"类型"下的http://msdn.microsoft.com/en-us/library/ms190324.aspx.