1

テーブルとビューの間の関係を確立するための自然なオプションはありますか、または回避策としてトリガーを使用してデータの一貫性を確認する必要がありますか?

ルックアップ ビューがあります (何らかの理由で、テーブルではなくビューにする必要があります)。別のテーブルにレコードを挿入したい。挿入するレコードの値の 1 つは、ルックアップ ビューの ID の 1 つである必要があります。

例えば:

ViewCities (CityId, CityName) -- これはルックアップ ビューです。別のデータベースにあるビューの背後にあるテーブル。今、tblUsers に新しい行を挿入したいと思います。行列の 1 つは CityId です。ViewCities に存在しない cityid を含む行を tblUsers に挿入できないようにしたいと思います。

4

1 に答える 1

0

参照整合性を維持するために私が認識している 2 つのオプションがあります。テーブルが 2 つの別々のデータベースにあると言ったため、外部キー制約を使用できません。オプションは次のとおりです。 1. おっしゃったように、トリガーを使用します。2. チェックを行うユーザー定義関数を参照するチェック制約を使用します。

例えば:

test という名前のデータベースがあり、別のデータベースが Northwind データベースであるとします。私のテスト データベースでは、ユーザーの名前を記録するテーブルを作成したいと考えています。強制したいチェックは、ユーザー名が Northwind データベース内のユーザーの LastName の 1 つである必要があることです。最初に次のように UDF を作成します。

create function chk_name (@name varchar(50))
returns bit
as
begin
declare @name_found bit=0
if exists(select * from Northwind..Employees where LastName=@name)
    begin
        set @name_found=1
    end

return @name_found 
end

次に、次のようなチェック制約を使用してテーブルを作成します。

create table tst
(name varchar(50) check ( dbo.chk_name(name)=1   )
)

ここで、tst テーブルに行を挿入しようとすると、それは Northwind データベースの Employees テーブルの姓の 1 つである必要があります。

于 2013-04-11T12:24:52.673 に答える