禁用所用触发器

語法
DISABLE TRIGGER { [ schema . ] trigger_name [ ,...n ] | ALL }
ON { object_name | DATABASE | ALL SERVER } [ ; ]

權限

若要禁用 DML 触发器,用户必须至少对为其创建触发器的表或视图具有 ALTER 权限。

若要禁用服务器作用域 (ON ALL SERVER) 中的 DDL 触发器,用户必须对该服务器具有 CONTROL SERVER 权限。若要禁用数据库作用域 (ON DATABASE) 中的 DDL 触发器,用户必须至少对当前数据库具有 ALTER ANY DATABASE DDL TRIGGER 权限。

默认情况下,创建触发器后会启用触发器。禁用触发器不会删除该触发器。该触发器仍然作为对象存在于当前数据库中。但是,当执行编写触发器程序所用的任何 Transact-SQL 语句时,不会激发触发器。可以使用 ENABLE TRIGGER 重新启用 DML 和 DDL 触发器。还可以通过使用 ALTER TABLE 来禁用或启用为表所定义的 DML 触发器。

 

禁用对表的 DML 触发器

以下示例禁用对表 Address 创建的触发器 uAddress

USE AdventureWorks;
GO
DISABLE TRIGGER Person.uAddress ON Person.Address;
GO

禁用 DDL 触发器

下面的示例创建一个数据库作用域的 DDL 触发器 safety,然后禁用该触发器。

CREATE TRIGGER safety 
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE
AS
PRINT 'You must disable Trigger "safety" to drop or alter tables!'
ROLLBACK;
GO
DISABLE TRIGGER safety ON DATABASE
GO

禁用以同一作用域定义的所有触发器

以下示例禁用在服务器作用域中创建的所有 DDL 触发器。

USE AdventureWorks;
GO
DISABLE Trigger ALL ON ALL SERVER;
GO


 

declare @IDList as varchar(8000)
declare @ID as int
declare @i as int
declare @sql varchar(500)

declare @tableName varchar(500)
declare @trigger varchar(500)

set @tableName=''
set @trigger=''
set @IDList=''

select @IDList=@IDList+cast(ID as varchar(500))+',' from    sysobjects bbbb   where   type='tr' order by ID

if len(@IDList)=0
return


while CharIndex(',',@IDList)<>0
Begin
set @ID = SubString(@IDList,1,CharIndex(',',@IDList)-1)
set @IDList = Replace(','+@IDList,','+Cast(@ID as nvarchar(50))+',','')
--select @ID

select @trigger=name,@tableName=(select [name] from sysobjects eee where eee.id=bbbb.parent_obj) from   sysobjects bbbb   where   type='tr' and id=@ID

--如果要启用,disable改成enable
set @sql = 'alter table '+ @tableName +' disable trigger ' + @trigger
exec(@sql)
--print(@sql)

End

posted @ 2008-11-05 15:43  QQ天堂  阅读(1530)  评论(0编辑  收藏  举报