1

整合性を確認するためにビューのフィールドを参照する可能性はありますか?

擬似コードの例:

CREATE VIEW V_ONE AS SELECT .....
CREATE TABLE TWO ( ID INT REFERENCES V_ONE ( field ))

最初の代わりに参照できるようにしたくありません。CREATE TABLE T_ONEV_ONET_ONE

@編集:

ViewV_ONEは、erp システムの複数のテーブルからデータを収集し、それらを前処理します。テーブルは、 に含まれてはならないいくつかの追加データでTWO拡張されます。のすべてのエントリに対してテーブルにエントリがあってはなりませんが、ベースデータが見つからないエントリがテーブルにないことを確認したいと思います。V_ONEV_ONETWOV_ONETWOV_ONE

4

2 に答える 2

5

短い答え:いいえ。Sql Server では、ビューで外部キーを使用できません。

ビューで参照されている「テーブルの1つ」に外部キー制約を設定できますが、コンテキストがなければ...便利な答えを出すのは難しいです。

編集:まあ、v_one のクエリで、Twoのチェック制約はどうですか?

ただし、v_one の「ソース テーブル」で削除 (および更新) を管理する方法を見つける必要があります。

テーブル(TWO)のチェック制約を使用して、ビュー(V_ONE)でINSTEAD OF DELETE(および必要に応じてINSTEAD OF UPDATE )トリガーを(テストされていない)使用できます。

于 2013-01-14T12:58:30.533 に答える
0

外部キーではなく、チェック制約を使用して同様の結果を得ることができます。

-- CREATE VIEW THAT RETURNS DUMMY DATA
CREATE VIEW V_ONE
AS
SELECT  Field
FROM    (VALUES (1), (2), (3)) T (Field);
GO

-- CREATE FUNCTION THAT VALIDATES CRITERIA
CREATE FUNCTION dbo.CheckFunction (@ID INT)
RETURNS BIT AS
BEGIN

    IF EXISTS (SELECT 1 FROM V_ONE WHERE Field = @ID)
    BEGIN
        RETURN 1;
    END

    RETURN 0;

END
GO
-- CREATE TABLE THAT REFERENCES VIEW
CREATE TABLE T_TWO (ID INT NOT NULL CONSTRAINT CHK_T_TWO_ID CHECK (dbo.CheckFunction(ID) = 1));

-- TRY INSERTING A VALUE NOT RETURNED BY V_ONE
INSERT T_TWO VALUES (4);

おそらく、V_One のソースへの削除/更新を処理するトリガーを実装する必要があります。おそらく、ソースにも外部キーを追加する必要があります。

于 2013-01-14T13:22:19.053 に答える