触发器级联删除与外键冲突?

freetank 2000-11-23 05:24:00
大虾:
如下两个表:
create table Company(
ComId char(10) not null,
Name char(50),
primary key(ComId)
);
create table Employee(
EmpId char(10) not null,
ComId char(10) not null,
primary key(EmpId)
foreign key(ComId) references Company(ComId)
);
如果我删除一个公司,那么属于本公司的职员也要删除,照书写了个触发器:
create trigger trDel on Company for delete
as
if @@rowcount=0
return
delete employee
from deleted d,employee e
where d.comid=e.comid
if @@error!=0
begin
raiserror("Error Encountered in trigger processing",16,1)
rollback tran
return
end
return
可是我根本无法删除Company和Employee的内容,SQL Server报告外键约束冲突:
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_ComId'...
也就是触发器根本没触发...
请大虾为小弟指点迷津!

...全文
815 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangzi 2001-02-16
  • 打赏
  • 举报
回复
先删除职员,后删除公司。
DeD 2001-02-16
  • 打赏
  • 举报
回复
不好意思写错了,更正
create procedure delCompany
@comid varchar(10)
as
begin tran
delete from Employee where ComID=@comid --此处
delete from Company where ComID=@comid
commit tran

exec delCompany '001'
DeD 2001-02-16
  • 打赏
  • 举报
回复
这种还是通过程序来实现比较妥当

create procedure delCompany
@comid varchar(10)
as
begin tran
delete from Company where ComID=@comid
delete from Employee where ComID=@comid
commit tran

exec delCompany '001'
none 2001-02-16
  • 打赏
  • 举报
回复
在ms sql server 7.0之中,外键约束优先于触发器。所以不能用触发器实现级联删除。
听说sql server 2000中可以,但我不敢肯定。
tanghuan 2000-11-24
  • 打赏
  • 举报
回复
你在写触发器时一定要明白

在你操作表记录(插入,删除,修改)时,数据库处理步骤如下
1。执行前触发器(微软 MSSQL 没有前触发器,所以没有这一步)
2。进行数据合法性,一致性,完整性检查,如果不能通过,就报错并回滚
3。数据真正作用在数据库中
4。执行相应触发器

你的数据操作在步骤2时就违背了完整性约束(主外键约束),已经出错,当然不会执行触发器

法一:你可以先删除外键记录后在删除主键内容
法二:修改数据库,取消主外键关系,由触发器实现
pjy 2000-11-23
  • 打赏
  • 举报
回复
你如果使用外键,你上述的用法本身就违背了外键的定义。你只能在程序中先删除对应的职员记录在删除公司!
zhaowd 2000-11-23
  • 打赏
  • 举报
回复
这可能是个先后的问题,先删除后触发,因此就会出现报错信息?
还是把删除关联记录做到程序中去吧!

34,594

社区成员

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

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