CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

如何知道哪些触发器被禁用?

楼主AntingZ(夕惕若)2004-08-01 14:32:08 在 MS-SQL Server / 基础类 提问

只知道在查询分析器里面用    
  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

相关问题

  • 如何禁用触发器
  • 如何禁用和重新使能触发器?
  • 请问如何禁用某个触发器!急!
  • 如何在存储过程或触发器里 临时禁用触发器的嵌套?
  • 那位老兄知道在sqlserver中如何区分insert触发器和after insert 触发器?
  • 如何得知表有哪些触发器
  • 怎么知道一个表有又个触发器?
  • 如何知道触发器是在哪个表中?
  • 怎样知道数据库里有些什幺触发器?
  • 如何知道触发触发器的表名

关键词

  • 语句
  • 测试
  • 触发器
  • 禁用
  • trigb
  • 启用
  • trigger
  • endfrom
  • 表
  • 删除

得分解答快速导航

  • 帖主:AntingZ
  • happydreamer
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo