oracle 级联查询询触发器

如何用触发器进行级联修改。_百度知道
如何用触发器进行级联修改。
如果两个表没有建立外键关系,能进行级联修改吗?就是例如 A表有两个字段 id和aname,B表也有两个字段,id和bname,bname是参照aname的,如果我想在修改A表中aname字段的同时,也把B表中的bname字段也改了,那应该如何弄啊,请高手指教
我有更好的答案
我不是高手不过知道一点点:create
trigger tri_update_Aon
updateasdeclare
char(10),@新name
char(10)select
@原aname=deleted . aname , @新name=inserted . anamefrom
deleted,insertedwhere
deleted . id=inserted . idprint
'准备级联更新B表中的bname信息'update
bname=@新namewhere
bname=@原aname
其他类似问题
为您推荐:
您可能关注的推广
触发器的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁使用SQL触发器删除级联记录 - 428 - 博客园
SQL触发器:当改变(增、删、改)数据表的记录时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。
比如,当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过触发器,我们就可以实现。
delete from category where id=5&&--sql删除语句
create trigger trigcategorydelete&&--当执行sql删除语句时,执行触发器
on category
after delete
delete news where caId=(select id from deleted) --删除对应新闻类别的新闻内容
照一般的思维,这样就可以同时删除新闻类别和其下的新闻内容,但是这样执行却不成功。是因为关键字AFTER,AFTER表示在执行SQL删除语句后,再执行触发器里的语句。这样一来,顺序同样是先删除新闻再删除新闻内容,肯定不成功。
改变关键字after为instead of
instead of,表示代替delete操作,而没有真正delete from category where id=5,当category表的删除时,同时触发了trigcategorydelete触发器,但是由于有instead of关键字,所以本身并不执行删除操作,而是执行触发器里的sql语句,从而可以替代之前的SQL语句。比如:
create trigger trigcategorydelete
on category
instead of delete
declare @id int&&--定义一个变量id
select @id=id from deleted&&--从deleted临时表中,赋值id给变量@id
delete news where caId=@id&&--先删除该类别下的所有新闻
delete category where id=@id&&--然后删除新闻类别&
当我们执行&delete from category where id=5时,id=5的类别并没有真正删除,而是转而执行触发器里面的SQL语句
关于deleted表:
Deleted表用于存储&DELETE 和 UPDATE&语句所影响的行的复本。在执行&DELETE 或 UPDATE语句时,行从触发器表中删除,并传输到deleted表中。Deleted表和触发器表通常没有相同的行。(//最后一句不是怎么明白啊?) by google
删除一条记录时候,他会把删除的这条记录放在一张临时表里,当你对category表进行删除时,在SQL返回的结果消息里面会提示出你删除的记录。2044人阅读
触发器不能用于执行级联更新和删除如果 ForeignKey 到字段名关系 (或 ForeignKey 到唯一的关系) 使用 SQL Server 的建立 DRI。 该 DRI 约束进行第一次测试 ; 如果更新或删除通过所有约束限制仅激发触发器。 因此,因为任何更新或需要进行层叠的删除将失败约束检查,DRI ForeignKey 约束不能存在上需要进行层叠这些关系。 通过不声明 ForeignKey (或引用) 约束,级联更新和删除可以实现使用触发器。 仍应使用字段名和唯一约束,但是。 删除触发器,在主表上的删除行在相关表中,或将所有相应 ForeignKeys 设置为 Null (或它们的默认值)。 级联删除轻松地执行嵌套触发器与每个删除相关表中的所有行。 濡傛灉杩欎簺鏇存柊必须层叠到相关表中的其他级别,级联 SetNull 和 SetDefault 可能是由于以多行的考虑事项与触发器问题多多。 然而,在 ForeignKeys 不也是相关表的字段名的一部分,如果它们可以只需更新从触发器内。 用于实现已级联的更新,在主表上的一个更新触发器应执行辅助表中的所需的数据修改。 再次,只要正在更新 ForeignKey 不是依赖于表的字段名的一部分,它只是由更新触发器内。 提供与 SQL Server 4.2 x 提供的示例在文档更新和删除实施了参照完整性的触发器。 所附的 SQL Server 的触发器文档描述用于业务规则强制执行,而不是参照完整性的触发器,但如何触发器工时和 Multirow 注意事项上的信息是信息性的 (请参阅该 SQL Server"数据库开发人员助理"第 6 章)。 下面是一个示例的一个级联删除 titles 表中删除具有匹配 ForeignKey 值 titleauthor 表中的所有行上的触发器。 因为 title_id 是 titleauthor 的字段名的一部分,此触发器将假定有没有后续级别的具有 ForeignKeys titleauthor 引用的表。 请注意这将正常运行甚至作为关于多行删除操作。
CREATE TRIGGER DelCascadeTrig
FOR DELETE
DELETE titleauthor
FROM titleauthor, deleted
WHERE titleauthor.title_id = deleted.title_id
下面是一个 SetNull 的示例删除更新 titleauthor 表中的所有行具有匹配的外键值 titleauthor 表上的触发器。 再次,因为 title_id 是 titleauthor 的字段名的一部分,此触发器将假定有没有后续级别的具有 ForeignKeys titleauthor 引用的表。 这将甚至作为关于多行删除操作正确工作。
CREATE TRIGGER DelSetNullTrig
FOR DELETE
UPDATE titleauthor
SET titleauthor.title_id = NULL
FROM titleauthor, deleted
WHERE titleauthor.title_id = deleted.title_id
以下是级联更新触发器在 titles 表中具有匹配的外键值更新 titleauthor 表中的所有行上的一个示例。 再次,因为 title_id 是 titleauthor 的字段名的一部分,此触发器将假定有没有后续级别的具有 ForeignKeys titleauthor 引用的表。
CREATE TRIGGER UpdCascadeTrigBad
FOR UPDATE
IF UPDATE(title_id)
UPDATE titleauthor
SET titleauthor.title_id = inserted.title_id
FROM titleauthor, deleted, inserted
WHERE titleauthor.title_id = deleted.title_id
这将不能正常工作的多行更新因为没有要匹配其对应的行插入表中与已删除的表中给定的行而不添加第二个的唯一标识符永远不会更改其值的方法。 这是当在级联需要采取后续级别在 ForeignKey 依赖的表中字段名的一部分,并且依赖于表格中的字段名由其他 ForeignKeys 引用时,出现同样的问题。 若要防止关于多行更新,前面触发器应将重写要防止更新影响多个行的原始表 (标题在这种情况下)。 注意在触发器中的更新可能嗯更新 titleauthor 中的多个行 ; 此解决方案以多行的问题可能只是导致问题重新出现在层叠中下一级别。
CREATE TRIGGER UpdCascadeTrig
FOR UPDATE
IF UPDATE(title_id)
IF @@ROWCOUNT = 1
UPDATE titleauthor
SET titleauthor.title_id = inserted.title_id
FROM titleauthor, deleted, inserted
WHERE titleauthor.title_id = deleted.title_id
ROLLBACK TRANSACTION
RAISERROR ('Multi-row update on table "titles" not allowed.')
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:99030次
积分:1272
积分:1272
排名:第18414名
原创:16篇
转载:44篇
评论:14条
(1)(1)(6)(3)(41)(9)应用SQL触发器删除级联记载(1) - 谷普下载 |
| 您所在的位置: >
> 应用SQL触发器删除级联记载(1)应用SQL触发器删除级联记载(1)编辑:风雷电&&&&来源:不详&&&&更新:&&&&人气:加载中...&&&&字号:|标签:&&&&&&&&&&
下文将为您介绍应用SQL来揭发的法子,并附相关实例,供您参考,愿望对您有所赞助。
SQL:当改变(增、删、改)数据表的记载时,绑定在SQL语句(增、删、改)中的触发器能够触发某些事件或者函数,所以我们可以在触发器中编写一些处理语句。
比如,当我们新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记载,但是通过触发器,我们就可以实现。
delete from category where id=5& --sql删除语句
create trigger trigcategorydelete& --当履行sql删除语句时,履行触发器
on category
after delete
delete news where caId=(select id from deleted) --删除对应新闻类别的新闻内容
照一般的思维,这样就可以同时删除新闻类别和其下的新闻内容,但是这样履行却不成功。是因为关键字AFTER,AFTER表示在履行SQL删除语句后,再履行触发器里的语句。这样一来,顺序同样是先删除新闻再删除新闻内容,肯定不成功。
改变关键字after为instead of
评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
分类选择您可能在找这些sql触发器实现级联删除,但是级联的删了,原表没删掉,是代码有什么问题么?_百度知道
提问者采纳
instead of delete因为用的是这个替代触发器,会替代原有的操作,造成原有的操作无效如果没有外键关系的,可以用for出发器,或者建立主外键关系设置级联删除操作,而不用触发器也可以
提问者评价
来自团队:
其他类似问题
为您推荐:
sql触发器的相关知识
其他1条回答
建议查看有没有别的外键约束,从而无法删除数据。
看了,没有其它外键了,而且要是有其它外键约束的话,在删除的时候会报错啊。
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 hibernate级联查询 的文章

 

随机推荐