Вставка в представление возвращает 2 затронутых строки - PullRequest
2 голосов
/ 30 июня 2011

В Sql Server 2005 у меня есть две базы данных. В первом у меня есть такая таблица:

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

Во втором у меня вид такой:

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

Когда я вставляю в вид:

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);
}

Я получаю затрагиваемые строки равными двум, в то время как мое ожидаемое значение равно 1.

1 Ответ

4 голосов
/ 30 июня 2011

Этот вопрос обычно заставляет меня думать, что "триггеры".

Я только что создал точную копию вашего сценария (спасибо за подробные инструкции), и я вроде как вижу похожие результаты.

В смысле я имел в виду, что при выполнении вставки SSMS выводит

(затронут 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

Проблема в том, что и триггер, и фактическая таблица в исходной базе данных сообщают, что они обновили строку. Если вы удалите эту отчетность из триггера, но оставите ее в исходной базе данных, вы всегда получите верный ответ, будь то обновление через представление или непосредственно в исходную таблицу.

...