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"