Sql server 2008 约束或触发器

Sql server 2008 约束或触发器,sql-server-2008,triggers,constraints,Sql Server 2008,Triggers,Constraints,我现在真的很热 我有两张桌子 月付款(EmpID、付款类型、swiftcode) EmpAssignment(EmpID,状态) EmpAssignment.Status只能是1或2 问题是: 我希望有一个约束或触发器,以便在更新月付款时,如果PaymentType=1,则Swiftcode应该是唯一的,并且仅对那些状态=1的人是强制性的 如果PaymentType 1,swiftcode不应是强制性的,而应是唯一的 此外,该约束不应影响那些状态=2 提前感谢。使用域,约束将成为域约束: DRO

我现在真的很热

我有两张桌子

  • 月付款
    EmpID、付款类型、swiftcode
  • EmpAssignment
    EmpID,状态
  • EmpAssignment.Status
    只能是1或2

    问题是:

    我希望有一个约束或触发器,以便在更新
    月付款
    时,如果
    PaymentType=1
    ,则
    Swiftcode
    应该是唯一的,并且仅对那些
    状态=1
    的人是强制性的

    如果
    PaymentType 1
    swiftcode
    不应是强制性的,而应是唯一的 此外,该约束不应影响那些
    状态=2


    提前感谢。

    使用域,约束将成为域约束:

    DROP DOMAIN PAYTYPE CASCADE;
    CREATE DOMAIN PAYTYPE AS INTEGER
        CHECK (value >= 1 AND value <= 666)
        ;
    
    DROP DOMAIN ESTATUS CASCADE;
    CREATE DOMAIN ESTATUS AS INTEGER
        CHECK (value >= 1 AND value <= 2)
        ;
    
    DROP TABLE MonthlyPayment CASCADE;
    CREATE TABLE MonthlyPayment
        ( EmpID INTEGER NOT NULL PRIMARY KEY
        , PaymentType PAYTYPE NOT NULL
        , swiftcode varchar
        );
    
    DROP TABLE EmpAssignment CASCADE;
    CREATE TABLE EmpAssignment
        ( EmpID INTEGER NOT NULL PRIMARY KEY
        , status ESTATUS NOT NULL
        );
    
    结果(使用Postgresql-9.1):


    使用域时,约束将成为域约束:

    DROP DOMAIN PAYTYPE CASCADE;
    CREATE DOMAIN PAYTYPE AS INTEGER
        CHECK (value >= 1 AND value <= 666)
        ;
    
    DROP DOMAIN ESTATUS CASCADE;
    CREATE DOMAIN ESTATUS AS INTEGER
        CHECK (value >= 1 AND value <= 2)
        ;
    
    DROP TABLE MonthlyPayment CASCADE;
    CREATE TABLE MonthlyPayment
        ( EmpID INTEGER NOT NULL PRIMARY KEY
        , PaymentType PAYTYPE NOT NULL
        , swiftcode varchar
        );
    
    DROP TABLE EmpAssignment CASCADE;
    CREATE TABLE EmpAssignment
        ( EmpID INTEGER NOT NULL PRIMARY KEY
        , status ESTATUS NOT NULL
        );
    
    结果(使用Postgresql-9.1):



    什么RDBMS和版本?第三个选项:创建一个
    ,并使状态使用该域。因此,
    swiftcode
    应始终是唯一的(跨所有行),如果不是
    null
    ,则
    EmpAssignment.Status
    上的约束需要
    检查
    约束,如果您使用的是Oracle或SQL Server之类的RDBMS。否则就触发了。对于您正在谈论的另一个约束,它超出了大多数RDBMS内置约束类型的范围,因此您需要为此设置一个触发器。我使用SQl Server 2008,是的SwiftCode应该始终是唯一的什么RDBMS和版本?第三个选项:创建一个
    ,并使状态使用该域。因此,
    swiftcode
    应始终是唯一的(跨所有行),前提是它不是
    null
    ?如果您使用的是Oracle或SQL Server之类的RDBMS,
    EmpAssignment.Status
    上的约束将需要
    检查
    约束。否则就触发了。对于您正在谈论的另一个约束,它超出了大多数RDBMS的内置约束类型的范围,因此您需要为此设置一个触发器。我使用SQl Server 2008,是的,SwiftCode应该始终是唯一的查看OP之前的问题这可能对他们没用,因为他们在SQL Server上,但是+1.OP没有提到平台。域是在ANSI,iirc。Oracle和postgres都有,所以微软和sybase也可以。是的,SQL Server也可以有。顺便说一句:现在我再次阅读了OQ,并得出结论,OP实际上需要跨字段约束,甚至是跨表约束。(我不明白为什么会有两个单独的表,顺便说一句)这意味着触发器欺骗,甚至可能有第三个表,包含允许的和有效的组合。当在同一个表中时,部分索引就足够了。@wildplasser:不,Oracle没有域。查看OP前面的问题,这可能对他们没有用处,因为他们在SQL Server上,但+1.OP没有提到平台。域是在ANSI,iirc。Oracle和postgres都有,所以微软和sybase也可以。是的,SQL Server也可以有。顺便说一句:现在我再次阅读了OQ,并得出结论,OP实际上需要跨字段约束,甚至是跨表约束。(我不明白为什么会有两个单独的表,顺便说一句)这意味着触发器欺骗,甚至可能有第三个表,包含允许的和有效的组合。当在同一个表中时,部分索引就足够了。@wildplasser:否,Oracle没有域。
    
    ERROR:  value for domain estatus violates check constraint "estatus_check"