在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);
}
我受影响的行等于2,而我的期望值是1。
答案 0 :(得分:4)
这类问题通常会让我想到“触发器”。
我刚刚创建了一个完整的场景副本(感谢详细说明),我看到了类似的结果。
有点,我的意思是当我执行插入时,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
问题是原始数据库上的触发器和实际表都报告他们已经更新了一行。如果从触发器中删除此报告,但将其保留在原始数据库中,则无论是通过视图更新还是直接更新到原始表,您都将获得真实答案。