规则(Transact-SQL)[1]是可重用的,可以克服检查约束不可重用的缺点。

现在我读到:

  • “此功能将在未来版本的Microsoft SQL Server中删除。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。我们建议您使用检查约束。检查约束是通过使用create table或alter table的check关键字创建的。”

那么,什么是规则而不是规则,为什么它们被否决?


=== 更新:
Alexkuznetsov,表级检查约束是否非常慢?
或者,与列级检查约束和resp相比,使用函数的表级检查约束速度较慢。规则作为其等价物(因为规则只是列级别)?

换句话说,列级检查约束和规则(隐式地只是列级)在性能上是否相等?
然后,我只看到可重用特性的删除。以前使用过不可重用的表级约束。

此外,我更感兴趣的是了解为什么以及进一步期望什么,然后了解如何使用以前一直可用的旧功能实现不推荐使用的系统功能的自定义替换。

〔1〕
MS SQL Server 2008 R2联机丛书。创建规则(Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188064.aspx

2 回复  |  直到 14 年前
    1
  •  3
  •   Kuberchaun    14 年前

    好吧,一个原因是,规则可能是次要的,我相信对于规则,每列只能有一个,它们只检查进入数据库的数据,也就是说,它们不检查数据库中已经存在的数据。使用检查约束,您可以在一个给定的列上有多个约束,并且它们对所有数据(传入的数据和数据库中已经存在的数据)强制执行。考虑到规则对于什么是检查约束似乎是一个糟糕的解决方案,微软可能最终意识到是时候摆脱它们了,而且它们不是SQL标准。

    如果一个检查约束没有切断它,您也可以使用一个触发器来获得更复杂的逻辑。

        2
  •  3
  •   Jeff Wight    14 年前

    如果您担心的是您希望编写一次约束的“代码”并在多个列上重复使用它,我建议您执行以下操作:

    使用约束规则创建函数:

    CREATE FUNCTION schema.PositiveInteger(INT val)
    RETURNS INT AS
    BEGIN
        IF (val > 0) RETURN 1
        ELSE RETURN 0
    END
    

    将该函数作为约束添加到列中:

    ALTER TABLE tbl ADD CONSTRAINT chkMyRules CHECK (schema.PositiveInteger(tbl.IntColumn) = 1);
    

    最重要的是,你现在可以写 可重复使用的 考虑多列的规则。

    CREATE FUNCTION ... (INT val, DATETIME date) RETURNS INT AS ......
    ALTER TABLE tbl ADD CONSTRAINT chkMultipleCols CHECK (func(col1, col2) = 1);
    

    享受!