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- multirow-updates.aspx では、遅くて失敗する可能性があります

個人的には、これにはトリガーを使用します。UDF とチェック制約を使用して何を得ているのかはわかりませんが、「トリガーを使用していません」と言うことができます。また、トリガーを起動する何らかのイベントを必要としない制約に突然違反すると、どのような変更が発生しますか?

于 2013-01-29T22:59:45.357 に答える