我会对用户定义的函数使用检查约束。
有使用触发器在这两个好处:
- 这是检查约束是专为。
- 使用触发器将需要一个替代插入而不是更新触发器,导致代码更长,难以编写和维护。
下面是一个简单的例子:
创建测试表:
CREATE TABLE Test
(
Col1 int
)
GO
创建验证功能:
CREATE FUNCTION dbo.IsValueAllowed
(
@Value int
)
RETURNS bit
AS
BEGIN
IF (SELECT COUNT(*) FROM Test WHERE Col1 = @Value) > 4 RETURN 0
RETURN 1
END
GO
添加检查约束表
ALTER TABLE Test
ADD CONSTRAINT ck_RestrictCol1 CHECK (dbo.IsValueAllowed(Col1) = 1)
GO
个
测试:
INSERT INTO Test VALUES
(1), (1), (1), (1),
(2), (2), (2)
INSERT INTO Test VALUES (2)
SELECT *
FROM Test
INSERT INTO Test VALUES (1) -- This will fail with an error message: The INSERT statement conflicted with the CHECK constraint "ck_RestrictCol1"
see a live demo on rextester.
触发都会做。还有其他选项可以使用组合键和限制第二列中的值。但在这种情况下,第二列中的增值应该保留在业务层。 – MKR
我同意触发器。您可以在调用函数的表上添加检查约束,但这并不理想。你也可以用其中的逻辑写一个存储过程。 – squillman