sqlserver级联删除记录 (200分)

  • 主题发起人 主题发起人 iwalk
  • 开始时间 开始时间
I

iwalk

Unregistered / Unconfirmed
GUEST, unregistred user!
级联删除的问题:即主表记录删除时,将另一个表中的相关记录删除。
我用delphi6/ado/sqlserver2000
分别用两种方法实现,现有如下问题:

1、如何在程序中用alter命令给一个主表加delete触发器?该表本身有一个insert触发器
要求在加之前写先判断此delete触发器是否存在。
2、用alter命令,给主表本身加上级联删除功能,请用命令实现。

另外,大侠觉得这两个办法哪个好些?请高手赐教!
如果肯贴一段例程,定有高分相赠!

 
我不记太多东东的,所以你提供简单办法给你,总之道理总有一个,发sql命令,
查询分析器能做的ADOQuery当然能做了.
1>你在企业管理器建一个触发器,然后用企业管理器生成这个表的sql脚本,
找到生成触发器的那一段拷贝出来就是了
2>同上,建一个级联更新的关系,生成sql脚本,....
检查对象是否存在,有一个系统存储表和存储过程的,忘记名字了
看了生成的sql,可能你觉是也很简单,本来就很简单啊,不过再简单我也不会去记
dml.
 
1.if exists(select * from sysobjects where id=object_id('del_name') and objectproperty(id,'istrigger')=1)
drop trigger del_name
go
create trigger del_name on table
for delete
as
......
2.我不知道
 
康兄:
要是每次进入程序都要重建触发器,那不太好吧,我的意思和你有一点点不同:
我想每次判断触发器是否存在,不存在才建,即我的代码如下,但是无法执行,请帮忙看看:
if NOT exists(select * from sysobjects where id=object_id('del_name') and objectproperty(id,'istrigger')=1)
-- drop trigger del_name //把这行去掉
-- go //这行也去掉
create trigger del_name on table
for delete
as
......
 
if exists(select * from sysobjects where name='del_name' and Type='t')
drop trigger del_name
go
create trigger del_name on table
for delete
as
 
网络上大家都在做这种判断,不消耗网络和服务器资源吗?
我就的还是事先建好为上策!!
 
To WangWei兄:
但是系统版本升级后需要加一个触发器,就有必要这样做了,我也是不得已而为之。

这样的语句无法执行,为何?
if NOT exists(select * from sysobjects where id=object_id('del_name') and objectproperty(id,'istrigger')=1)
create trigger del_name on table
for delete
as
begin
//do something
end

 
找到原因了,SQL中可能不能直接在子过程中使用create 命令,解决的办法
你先强行建立触发器,如果报错,就证明触发器已存在,否则的话也建立成功了!!
比较苯的办法,但是也可以解决问题啊!!
 
To WanWei:
//找到原因了,SQL中可能不能直接在子过程中使用create 命令
但是Create Table 命令是可以的啊,你的意思是不是说不能用Create Trigger 命令?
 
应该是不能用!!我说的方法你可以试一下,可以解决你的问题!!
 
后退
顶部