规则已被弃用,而不是(TSQL)?

时间:2010-10-01 14:13:58

标签: sql-server tsql sql-server-2008 constraints code-reuse

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

现在我读了[1]:

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

那么,什么是规则以及它们为何被弃用?


==== 更新:
AlexKuznetsov,表级检查限制非常慢吗? 或者,与列级检查约束和resp相比,使用函数的表级检查约束很慢。规则作为它们的等价物(因为规则只是列级)?

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

此外,我更感兴趣的是知道为什么以及如何进一步期望知道如何使用之前一直可用的旧功能来实现已弃用的系统功能的自定义替代品。

[1]
MS SQL Server 2008 R2联机丛书。 CREATE RULE(Transact-SQL)
http://msdn.microsoft.com/en-us/library/ms188064.aspx

2 个答案:

答案 0 :(得分:3)

有一个原因,规则可能采取副业是我相信规则,每列只能有一个,他们只检查进入数据库的数据,即他们不检查数据库中已有的现有数据。使用检查约束,您可以对给定列具有多个约束,并且它们对所有数据(进入的数据和数据库中已存在的数据)强制执行。鉴于规则似乎是一个穷人解决了什么检查约束,微软可能最终意识到是时候摆脱它们,加上它们不是SQL标准。

如果检查约束没有削减它,你还可以使用触发器来查看更复杂的逻辑。

答案 1 :(得分:3)

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

使用约束规则创建一个函数:

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);

享受!