【问题标题】:SQL Server constraints on foreign keysSQL Server 对外键的约束
【发布时间】:2011-12-11 09:02:29
【问题描述】:

我有一个 ItemComments 表,其中有一列带有外键约束,链接回第二个表中的项目条目。我认为这是一个一对多的关系,因为第二个表中的每个项目都可以有很多 cmets,但是没有两个项目可以与 ItemComments 表中的同一个评论条目相关联,所以多对多关系不会申请。

问题:

我想在此列上定义一个约束,以防止更新外键值,即我想防止有人意外更改与特定 ItemComment 条目关联的项目 ID。我对约束检查的表达式格式不是很熟悉,并且很好奇这种操作的语法是什么。还是有另一种更直接的方法来实现这一点?感谢您的帮助。

更新

是否像在多对多关系中那样实现交叉引用表来以这种方式强制引用完整性更好?还是增加了不必要的开销?

【问题讨论】:

    标签: sql-server sql-server-2005 tsql sql-server-2008 ssms


    【解决方案1】:

    您始终可以使用触发器。比如:

    create trigger dml_PreventUpdate
    on YourTable
    after update
    as
        if UPDATE(ItemId)
        rollback
    

    有两种类型的数据操作语言 (DML) 触发器。有一个INSTEAD OF,然后是一个AFTER/FOR 触发器(AFTERFOR 功能相同)。顾名思义,INSTEAD OF 触发器在事务发生之前执行。顾名思义,AFTER 触发器在触发操作之后执行。

    基本上,这个触发器所做的所有事情都是测试ItemId 列是否从针对表YourTable 运行的UPDATE 语句更新。每次有 UPDATEYourTable 时,都会触发此触发器,但如果 ItemId 是更新的字段,它只会在 ROLLBACK 事务中触发。

    【讨论】:

    • 嗨 Shark,我承认我不熟悉使用触发器,但这听起来像是一种选择。我会阅读更多关于这个主题的内容。
    • @kingrichard2005 我已经编辑了我的帖子,并添加了关于触发器以及到底发生了什么的简要说明。
    • 我明白了,听起来触发器是要走的路。我会接受你的回答。谢谢鲨鱼。
    • 除了回滚之外,您可能还想raiserror
    猜你喜欢
    • 2017-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 2016-06-04
    • 1970-01-01
    相关资源
    最近更新 更多