2011-06-30 7 views
2

Sql Server 2005では、2つのデータベースがあります。最初のもので、私はこのようなテーブルがあります:このようなトリガーとビューに挿入すると2行が返されます

CREATE VIEW [dbo].[SG] AS 
    SELECT id,sgName, active 
    FROM [FirstDatabase].dbo.SG WHERE hiddenf = 1 

CREATE TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
    INSERT INTO [FirstDatabase].dbo.SG(sgName,active,hiddenf) 
    SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END 

秒で

CREATE TABLE [dbo].[SG](
    [id] [int] IDENTITY(1,1) NOT NULL, 
    [sgName] [nvarchar](50) NOT NULL, 
    [active] [bit] NOT NULL, 
    [hiddenf] [int] NOT NULL 
) 

を、私はこのような見解を持っていますビューに挿入します。

using (SqlConnection connection = new SqlConnection(
       connectionString)) 
{ 
    SqlCommand command = new SqlCommand("INSERT INTO SG(sgName, active) VALUES('Test', 1)", connection); 
    var affectedRows = command.ExecuteNonQuery(); 
    Assert.AreEqual(1, affectedRows); 
} 

I ge t affectedRowsは2に等しいですが、私の期待値は1です。

答えて

4

この種の質問では、通常、「トリガー」と考えるようになります。

私はあなたのシナリオの正確なコピーを作成しました(詳細な説明のおかげで)、私は似たような結果を見ています。私は私は挿入を実行する、SSMS出力

(1行(複数可)の影響を受ける)

(1行(複数可)の影響を受ける)

意味の種類によって

しかし、元のデータベースをチェックすると、1行だけが追加されました。

はあなたの問題を解決するために、次の操作を行います。

ALTER TRIGGER [dbo].[InsteadTriggerSG] on [dbo].[SG] 
INSTEAD OF INSERT AS BEGIN 
    SET NOCOUNT ON -- adding this in stops it from reporting from in here 
    INSERT INTO [TEST].dbo.SG(sgName,active,hiddenf) 
    SELECT sgName,COALESCE (active,0), 1 FROM inserted 
END 

問題が引き金と元のデータベース上の実際のテーブルの両方が、彼らが行を更新したことを報告しているということです。このレポートをトリガから削除して元のデータベースに残しておくと、ビューを使用して更新するか、元のテーブルに直接反映するかにかかわらず、常に真の回答が得られます。

関連する問題