如何越过触发器?

疯狂低调 2004-11-11 09:39:30
各位大哥,小第需要删除数据库中表格的内容,但这个表格的触发器十分重要,能不能在执行我的特殊删除操作的时候不执行触发器,而进行普通的删除操作的时候正常执行触发器的内容?


谢谢各位!
...全文
240 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
prcgolf 2004-11-12
  • 打赏
  • 举报
回复
up
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复
--示例

--测试表
create table tb(a int)
insert tb select 1
union all select 2
go

--测试的触发器
create trigger tr_delete on tb
for delete
as
delete from tb
go

--通过事务自动加锁
--加锁效果可以再新开一个窗口,执行 select * from tb
--这时表是锁住的,因为这个查询不会被立即执行
begin tran
alter table tb disable trigger all
waitfor delay '00:01:00' --禁用触发器后延时1秒,以观察效果
delete from tb
alter table tb disable trigger all
commit tran
go

--删除测试
drop table tb
j9898 2004-11-11
  • 打赏
  • 举报
回复
如果以上方法都不行.而且你经常要做这样的操作.
触发器不能传递变量.所以:

那就在表内加一列flag,默认值为0

你删除表记录之前,改flag为1

修改触发器,flag的1的列则不执行语. 就是:只执行where flag=0.

davorsuker39 2004-11-11
  • 打赏
  • 举报
回复
UP
疯狂低调 2004-11-11
  • 打赏
  • 举报
回复
楼上的,你说的这个锁表,我觉得可以,在锁表之后,只有当前访问的用户可以修改这个表了吧?
其它的用户只能察看?

那么 锁表,和解锁的该怎么具体执行呢?
Thanks !
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复
既然是特殊的,那你在删除操作之间锁表不行吗?
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复

普通操作,直接处理

特殊操作:
--1.禁用触发器
alter table 表 disable trigger all

--2.删除
delete from 表

--3.恢复触发器工作
alter table 表 enable trigger all


这样做不行吗?
疯狂低调 2004-11-11
  • 打赏
  • 举报
回复
那个关闭触发器 然后执行,在开启触发器的方法虽然简单,但考虑到多用户情况下,还是不能使用的啊!
疯狂低调 2004-11-11
  • 打赏
  • 举报
回复
我想删除这个表中的纪录,而那个触发器关联着其它的表格,倘若直接删除表中的纪录,另外的表格的关联数据也会被删掉(这个是普通操作)。
特殊操作:仅仅删除这个表中的纪录,不触动触发器,或者不删除关联的数据。
lsxaa 2004-11-11
  • 打赏
  • 举报
回复
触发器是不能传参数的....? 不过可以通过其他方式


也可以在执行特殊操作的时候,禁用触发器,操作完成再启用....
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复
你用我的语句,在做特殊操作的时候,禁用触发器就行了嘛.
zheninchangjiang 2004-11-11
  • 打赏
  • 举报
回复
什么是普通的操作?
什么是特殊的操作?
lsxaa 2004-11-11
  • 打赏
  • 举报
回复
看你怎么规定特殊操作了???
疯狂低调 2004-11-11
  • 打赏
  • 举报
回复
在触发器做个判断?
这个比较有趣,我不大明白如何具体的实现,是向触发器传参,还是其他的什么?

有没有一个大体的框架呢?
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复
--禁用某个表的指定触发器
alter table 表名 disable trigger 触发器名

--启用某个表的指定触发器
alter table 表名 enable trigger 触发器名
zjcxc 元老 2004-11-11
  • 打赏
  • 举报
回复
--禁用某个表的所有触发器
alter table 表名 disable trigger all

--启用某个表的所有触发器
alter table 表名 enable trigger all
lsxaa 2004-11-11
  • 打赏
  • 举报
回复
什么样的算是特殊操作,举个例子
lsxaa 2004-11-11
  • 打赏
  • 举报
回复
在触发器做一个判断就行了

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧