如何知道哪些触发器被禁用?
只知道在查询分析器里面用
alter table t1 disable/enable trigger trig1
1。想知道整个数据库中有多少触发器目前是被禁用了。
2。在企业管理器中怎样禁用和不禁用trigger
问题点数:50、回复次数:15Top
1 楼happydreamer(www.sz.js.cn,www.gyxk.com)回复于 2004-08-01 15:10:46 得分 25
将trigger 在sysobjects 表中 status字段的值转换为二进制的,第12位为1则表示禁止,为0表示允许
create function convert1(@a int)
returns varchar(100)
as
begin
declare @b varchar(100)
set @b=''
while @a<>0
select @b=@b+rtrim(@a%2),@a=@a/2
return @b
end
select name,case when substring(dbo.convert1(status),12,1)=1 then '禁用' else '启用' end from sysobjects
where type='tr'
Top
2 楼yjr332533(圣骑士)回复于 2004-08-01 15:55:48 得分 0
值得学习.Top
3 楼AntingZ(夕惕若)回复于 2004-08-01 15:58:37 得分 0
厉害,以上语句在正常情况下完全正确。
但是有些时候不能准确反映真实的状态:
下面这个触发器是启用的,但你的代码出来的是禁用
(我在企业管理器里面拷贝出来的)
-----------------------------------------------------
CREATE TRIGGER [trigB] ON [dbo].[ta]
FOR INSERT
AS
insert tb(thename,thedate) select rtrim([bookname])+'B' ,getdate() from inserted
alter table [dbo].[ta] disable trigger [trigB]
alter table [dbo].[ta] disable trigger [trigB]
------------------------
后面的两行是我用Alter Table ta disable trigger trigB后系统自己加上去的,
然后我用Alter table ta enable trigger trigB后这两行语句还在那里。但实际上触发器现在可以工作了。不知道后面这两行就再也去不掉了,除非手工从企业管理器把他们删除,
删除后你的Sql语句就正常显示为‘启用' 了Top
4 楼zjcxc(邹建)回复于 2004-08-01 16:16:03 得分 0
系统自己会在触发器中添加那两行?? 不会吧?
我去试试.Top
5 楼zjcxc(邹建)回复于 2004-08-01 16:17:35 得分 0
企业管理器中查看确实会加上,但只会加上一条,不会加两条.Top
6 楼zjcxc(邹建)回复于 2004-08-01 16:18:39 得分 0
小黑的查询方法试过没有问题.Top
7 楼zjcxc(邹建)回复于 2004-08-01 16:31:15 得分 25
--既然是第12位是禁用/启用标志,这样写简单一点吧
select 表名=object_name(parent_obj),触发器名=name
,状态=case status & power(2,11) when 0 then '启用' else '禁用' end
from sysobjects
where type='TR'
Top
8 楼AntingZ(夕惕若)回复于 2004-08-01 16:52:09 得分 0
我也不知道是怎么会出现连续的两条,刚才还出现了连续三条
你可以手工加2条,然后用alter table ta enable trigger all测试一下
如果只有一条的话enable之后就会删除并启用
但是有两条或两条以上的话enable后trigger虽然是启用了,但不会删除这两条语句
Top
9 楼AntingZ(夕惕若)回复于 2004-08-01 16:56:40 得分 0
但是有两条或两条以上的话enable后trigger虽然是启用了,但不会删除这两条语句
如果出现这中情况的话,用你的sql语句的到的是'禁用' ,但实际上是启用状态
是不是我的电脑有问题?
OS: win2000 server
sql server: sql server 2000 (没有打Sp3)Top
10 楼zjcxc(邹建)回复于 2004-08-01 16:57:11 得分 0
--测试表
create table tb(a int)
go
--触发器
CREATE TRIGGER [trigB] ON tb
FOR INSERT
AS
insert tb select * from inserted
alter table tb disable trigger [trigB]
alter table tb disable trigger [trigB]
go
--显示触发器当前状态
select 表名=object_name(parent_obj),触发器名=name
,状态=case status & power(2,11) when 0 then '启用' else '禁用' end
from sysobjects
where type='TR'
go
--禁用触发器
alter table tb disable trigger [trigB]
--显示触发器当前状态
select 表名=object_name(parent_obj),触发器名=name
,状态=case status & power(2,11) when 0 then '启用' else '禁用' end
from sysobjects
where type='TR'
go
--启用触发器
alter table tb enable trigger [trigB]
--显示触发器当前状态
select 表名=object_name(parent_obj),触发器名=name
,状态=case status & power(2,11) when 0 then '启用' else '禁用' end
from sysobjects
where type='TR'
go
--删除测试的表
drop table tb
/*--测试结果
表名 触发器名 状态
-------- ---------- -------
tb trigB 启用
(所影响的行数为 1 行)
表名 触发器名 状态
-------- ---------- -------
tb trigB 禁用
(所影响的行数为 1 行)
表名 触发器名 状态
-------- ---------- -------
tb trigB 启用
(所影响的行数为 1 行)
--*/Top
11 楼zjcxc(邹建)回复于 2004-08-01 16:57:31 得分 0
上述我做的测试,没有发现问题.Top
12 楼AntingZ(夕惕若)回复于 2004-08-01 17:16:45 得分 0
奇怪了,用你的测试代码就一点问题都没有了,我再看看
万分感谢
Top
13 楼zonelive(peter)回复于 2004-08-01 18:55:30 得分 0
我测试了邹建的代码,但是发现,‘用’的前面的字用‘?’代替了
表名 触发器名 状态
-------------------------------------
report1 hj ?用
report1 hj1 ?用
report1 hjj1 ?用Top
14 楼zjcxc(邹建)回复于 2004-08-01 20:32:32 得分 0
--这样写应该就可以了
select 表名=object_name(parent_obj),触发器名=name
,状态=case status & power(2,11) when 0 then N'启用' else N'禁用' end
from sysobjects
where type='TR'Top
15 楼AntingZ(夕惕若)回复于 2004-08-01 21:14:50 得分 0
我的不加N也显示'启用' ,没出现什么问号!Top




