0

(以下 SQL 来自另一个帖子/用户,正在使用 SQL Server 中的 CHECK 约束模拟表级断言)

CREATE FUNCTION dbo.fnRedRows()
RETURNS INT
AS
BEGIN
    DECLARE @Return INT
    SELECT @Return=COUNT(*) FROM dbo.Red
    RETURN @Return
END
GO
CREATE TABLE dbo.Red 
(
    id INT IDENTITY(1,1), 
    test VARCHAR(max), 
    CONSTRAINT CK_MaxRows CHECK (dbo.fnRedRows()<5)
)
GO
INSERT INTO dbo.Red (test) VALUES ('HI')
INSERT INTO dbo.Red (test) VALUES ('The')
INSERT INTO dbo.Red (test) VALUES ('first four')
INSERT INTO dbo.Red (test) VALUES ('will work')
INSERT INTO dbo.Red (test) VALUES ('This one will fail')
GO
DROP TABLE dbo.Red
GO
DROP FUNCTION dbo.fnRedRows
GO

CHECK 是否从时间 t=0 开始保持完整性,而无需发生插入或其他事件(与触发器不同)?

4

1 回答 1

2

在检查约束中使用函数时要非常小心,它们并不总是有效,而且它们通常会成为性能问题。以下是一些严重破坏的示例:

https://web.archive.org/web/20171013131650/http://sqlblog.com/blogs/tibor_karaszi/archive/2009/12/17/be-careful-with-constraints-calling-udfs.aspx

https://web.archive.org/web/20180427092555/http://sqlblog.com/blogs/alexander_kuznetsov/archive/2009/06/25/scalar-udfs-wrapped-in-check-constraints-are-very-多行更新缓慢且可能失败

就我个人而言,我只会为此使用触发器。我不确定您通过使用 UDF 和检查约束获得了什么,除了您可以说“我没有使用触发器”。此外,什么样的变化会突然违反你的约束,不需要某种会触发触发器的事件?

于 2013-01-29T22:59:45.357 回答