六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 163|回复: 0

使用Trigger实现Cascading的功能

[复制链接]

升级  16%

184

主题

184

主题

184

主题

进士

Rank: 4

积分
580
 楼主| 发表于 2013-1-4 01:23:36 | 显示全部楼层 |阅读模式
<div id="cnblogs_post_body">使用数据库的朋友大家想必都知道,如果想要维持“一堆多”数据表数据的一致性,必须做到以下几点:
1)插入时,外键必须包含于主表(“1”对多中“1”那个表)关联字段集合中。
2)删除时,主表关联字段被删除,其子表关联数据也一律自动被删除。
3)更新时,主表关联字段被更新,其子表关联数据也一律自动被更新。
其实要做到这三点,最简单的一个做法莫过于:
1)打开SQL Management Studio,成功登陆之后打开某个数据库(展开“+”节点),并且找到“Diagram”(关联图),导入所需要的表。
2)从主表(“1”)鼠标左键按住不放,拖拽到从表(“多”)的“外键”字段。在弹出的对话框中分别确定设置主表和从表即将关联的主键和外键。
3)右键生成的那个关联线,设置插入/删除更新时候的情况:

更新和删除规则有若干选项——其中“级联”就是本文开头所说的部分——“一荣俱荣,一损俱损”。
至于“插入”时的外键一致性,在“强制外键约束”默认设定为“是”可以得到体现(因为一旦创建了表关系,那么外键也就自动检查必须是隶属于主表关联字段的一个元素)。
其实我们也可以采用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
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表