SQL-Server
2008 R2で設計されたテーブルがあります。
そのテーブルに列があり、データを挿入するときに別のテーブルと照合する必要があります。
ALTER TABLE Table1
WITH CHECK ADD CONSTRAINT CK_Code
CHECK (MyField in (Select Field From Table2))
これによりエラーが発生します
このコンテキストではサブクエリは許可されません。スカラー式のみが許可されます。
制約のチェック-このコンテキストではサブクエリは許可されていません に関するこの質問を見ました。
トリガーを使用せずにこれを達成する方法はありますか?
本当に欲しいのは外部キー制約です。つまり、チェックに「クエリ」を取得するには、クエリを含みスカラー値を出力する関数を記述し、その関数をチェック制約で使用できます。
CREATE FUNCTION myFunction (
@field DATATYPE(?)
)
RETURNS VARCHAR(5)
AS
BEGIN
IF EXISTS (SELECT* FROM Table2 WHERE MYFIELD = @field)
return 'True'
return 'False'
END
そんな感じ。未検証。
その後、次のようにチェックに追加できます
ALTER TABLE Table1
WITH CHECK ADD CONSTRAINT CK_Code
CHECK (myFunction(MYFIELD) = 'True')
チェック制約内にサブクエリを含めることはできません。できることは、チェック制約内でスカラー値を返すUDFを使用することです。
ステップ1:テーブルを作成する
USE CTBX
GO
CREATE TABLE RawMaterialByGender
(
RMGID int primary key identity(1,1),
RMID smallint foreign key references RawMaterialMaster(RMID),
LeveLMasterID smallint foreign key references LevelMaster(LevelTextID),
IsDeleted bit
)
ステップ2:スカラーを返すUDFを作成する
Create FUNCTION [dbo].[IsValidLevelMasterGender](@LevelMasterID smallint)
RETURNS bit
AS
BEGIN
DECLARE @count smallint;
DECLARE @return bit;
SELECT @count = count(LevelTextID)
FROM [LevelMaster]
WHERE LevelCategoryID = 3 AND IsActive = 1 AND LevelTextID=@LevelMasterID
IF(@count = 0)
SET @return = 'false';
ELSE
SET @return = 'true';
RETURN @return;
END;
GO
ステップ3:テーブルを変更してCHECK制約を追加します
ALTER TABLE RawMaterialByGender
ADD CONSTRAINT check_LevelMasterID CHECK (dbo.IsValidLevelMasterGender(LeveLMasterID) = 'true')
ALTER TABLE Table1
ADD CONSTRAINT FK_Table1_Code FOREIGN KEY (MyField)
REFERENCES Table2 (Field) ;
参照: http://msdn.Microsoft.com/en-us/library/ms190273.aspx
注:構文については上記を確認していません。
まず、この例では、明らかにFK Constraintが必要です。
別の可能性は、WITH CHECK OPTION
でビューを使用し、それを介してユーザーにアクセスを許可することです。
CREATE TABLE Table1(i INT PRIMARY KEY, CK_Code CHAR(1));
CREATE TABLE Table2(Field CHAR(1));
INSERT INTO Table2(Field) VALUES ('A'),('B'), ('C');
GO
CREATE VIEW v_Table1
AS
SELECT *
FROM Table1
WHERE CK_code IN (SELECT Field FROM Table2) -- here goes your subquery check
WITH CHECK OPTION;
次のような「制約」に違反するデータを挿入しようとすると、
INSERT INTO v_Table1(i, CK_Code)
VALUES(10, 'D');
あなたが取得します:
ターゲットビューがWITH CHECK OPTIONを指定するか、WITH CHECK OPTIONを指定するビューにまたがっており、操作の結果の1つ以上の行がCHECK OPTION制約の下で修飾されていないため、挿入または更新の試行が失敗しました。
ステートメントは終了されました。