Serviceboy 发表于 2012-12-10 14:46:34

使用Trigger实现Cascading的功能

<div id="cnblogs_post_body">使用数据库的朋友大家想必都知道,如果想要维持“一堆多”数据表数据的一致性,必须做到以下几点:
1)插入时,外键必须包含于主表(“1”对多中“1”那个表)关联字段集合中。
2)删除时,主表关联字段被删除,其子表关联数据也一律自动被删除。
3)更新时,主表关联字段被更新,其子表关联数据也一律自动被更新。
其实要做到这三点,最简单的一个做法莫过于:
1)打开SQL Management Studio,成功登陆之后打开某个数据库(展开“+”节点),并且找到“Diagram”(关联图),导入所需要的表。
2)从主表(“1”)鼠标左键按住不放,拖拽到从表(“多”)的“外键”字段。在弹出的对话框中分别确定设置主表和从表即将关联的主键和外键。
3)右键生成的那个关联线,设置插入/删除更新时候的情况:
http://pic002.cnblogs.com/images/2012/343864/2012091114312376.png
更新和删除规则有若干选项——其中“级联”就是本文开头所说的部分——“一荣俱荣,一损俱损”。
至于“插入”时的外键一致性,在“强制外键约束”默认设定为“是”可以得到体现(因为一旦创建了表关系,那么外键也就自动检查必须是隶属于主表关联字段的一个元素)。
其实我们也可以采用Trigger来完成同样的任务——所谓Trigger即“触发器”(可以理解成“事件”,是一个特定动作行为产生之后所带来的连锁反应)。
对于“插入”时外键约束(我们假设有Categories和Products表,其中Category主表,其Id关联于从表的Products的CategoryId)。Trigger可以这样写:
<div class="cnblogs_code">Create TRIGGER [dbo].[AutoCheck]   ON [dbo].[tb_Products]   for insertAS BEGIN    begin tran      --保存欲待插入的categoryId    declare @newCategoryId int    select @newCategoryId = categoryid from inserted    if(select count(*) from tb_Category where id=@newCategoryId)=1      begin            print('成功插入!')            commit      end    else      begin            print('插入失败!')            rollback tran      endEND
页: [1]
查看完整版本: 使用Trigger实现Cascading的功能