(次の 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 から整合性を維持しますか?