代码之家  ›  专栏  ›  技术社区  ›  noonand

重用检查约束

  •  2
  • noonand  · 技术社区  · 15 年前

    在SQLServer中,假设一个列需要具有相同的数据类型,是否可以在表(或数据库)级别定义检查约束,并在定义时将其应用于列?

    ALTER TABLE dbo.tblAuditTrail
    ADD CONSTRAINT CK_DecimalNumber
    CHECK (DecimalColumn LIKE '^\-?\d+\.\d+$')
    GO
    

    现在您如何将它与在表级别创建它的一个或多个列相关联,或者是使用规则viz的答案。

    CREATE RULE RU_Decimal
    AS
    @value LIKE '^\-?\d+\.\d+$'
    GO
    

    我知道这个例子是人为的,人们会使用十进制列来表示十进制值,但由于设计选择不当,因此假设这是一个nchar列,并且您希望对它强制一些约束。

    2 回复  |  直到 15 年前
        1
  •  3
  •   Daniel Renshaw    15 年前

    尽管规则确实满足您的要求,但现在它们已被弃用,取而代之的是普通的旧检查约束。如果您认为数据库可能需要移动到SQL Server的未来版本,那么使用规则不是一个好主意。请参阅MSDN文档顶部的“重要”消息: http://msdn.microsoft.com/en-us/library/ms188064.aspx

    通过使用用户定义的函数并在所有检查约束中调用它,您可以获得一些重用,但仍然需要在应用该函数的所有列上显式定义检查约束。

    CREATE FUNCTION IsDecimal(@input varchar(max))
    RETURNS bit
    AS 
    BEGIN
        IF @value LIKE '^\-?\d+\.\d+$'
            RETURN 1
        ELSE
            RETURN 0
    END
    GO 
    
    ALTER TABLE dbo.tblAuditTrail     
        ADD CONSTRAINT CK_DecimalNumber     
        CHECK (dbo.IsDecimal(DecimalColumn) = 1)     
    GO
    
        2
  •  1
  •   Erwin Smout    15 年前

    使用SQL,您可以通过用户定义的类型来处理这种情况,通过将多个列声明为这种类型来实现“重用”,