2017-08-08 3 views
1

これは、ほとんどが好奇心の質問です。Microsoft SQL Serverのサブクエリを制限する

update table 
set column1 = 1 
where column2 in (1,2) 

しかし、これは、サブクエリが複数の値を返したことをエラーで実行まま:私はちょうどテスト・データベース上で、私は次のクエリを持っていた状況を経験してきました。

ここで、複数のIDキーがないこと、または 'in'の値が一意であることを確認しました。すべての意図と目的のために、これは起こってはいけません。

データベースのLIVEコピーをチェックすると、同じクエリに問題はありませんでした。したがって、最終的に私の質問は次のようになります。

このようなシナリオを作成するMicrosoft SQL Serverの設定またはデータベース構造は何ができますか?

+12

テーブルに更新トリガーがありますか?私はそれがしていることを推測しており、 'inserted'または' deleted'には1行だけがあると仮定しています。 –

+0

だから、PK違反に遭遇する唯一の方法は、Column1が複合PKまたはPKそのものの一部である場合です。クエリはまっすぐに見えます:同じタプル内のcolumn2で値(1)または(2)を見つけたら、column1を更新して(1)に設定します。私はあなたのテストDBがあなたの生産が異なる開始レコードを持っていると推測しています。プロダクション値をテストDBにコピーして再度実行できますか? – Milan

+0

@Milan「サブクエリが複数の値を返しました」から「PK違反」になったのはどうでしたか? – HABO

答えて

2

このようなシナリオを作成するMicrosoft SQL Serverの設定やデータベース構造には、どのようなことがありますか?

コメントに記載されているように、おそらくトリガーが書かれていません。サンプルシナリオ:

CREATE TABLE aud(column2 INT, comment NVARCHAR(150)); 
CREATE TABLE tab(column1 INT, column2 INT); 

INSERT INTO aud(column2) VALUES (1),(2),(3); 
INSERT INTO tab(column1, column2) VALUES (0,1),(-1, 2), (-2,3); 
GO 

CREATE TRIGGER trg_tab_i ON tab 
FOR UPDATE 
AS 
BEGIN 
    UPDATE aud 
    SET comment = 'Changed value ...' 
    WHERE column2 = (SELECT column2 FROM inserted); 
END 
GO 


UPDATE tab 
SET column1 = 1 
WHERE column2 in (1,2); 

メッセージ512、レベル16、状態1、プロシージャtrg_tab_i、ライン5 [バッチスタートライン19]

サブクエリは複数の値を返しました。 =、!=、<、< =、>、> =、またはサブクエリが式として使用されている場合は、これは許可されません。

UPDATE tab 
SET column1 = 1 
WHERE column2 in (1); 
-- (1 row(s) affected) 
-- (1 row(s) affected) 

DBFiddle Demo

のみ1行が、すべての作品に影響を与えています。

+1

ありがとう。私たちのソフトウェアベンダーがカスタム機能のトリガをテストしていたことが判明し、私たちは_test DBにそれを作ったことを知らなかった。 (私の同僚はそれを認識していましたが、彼はそれが障害の引き金だったとは決して考えなかった) – EkeshOkor

関連する問題