我创建了第一个触发器。请参阅下面的触发器的代码部分。
触发器和结果符合预期,除了一件事。
因此,当我运行下面的代码时,它不会将值插入到我的表中,因此记录数保持不变。
insert into MatlabSearchPath(directory, userName)
values('madeup', 'default')
在消息窗口中虽然我得到了两行。我不明白为什么我看到两行,特别是一行受影响 - 我的表中的记录数没有改变?
(0 row(s) affected)
(1 row(s) affected)
触发
create trigger trDefaultPathInsert on DVLP_QES.dbo.MatlabSearchPath
instead of insert
as
begin
declare @defCount int
declare @retVal int
select @defCount = count(userName) from inserted where userName = 'Default'
if (@defCount > 0)
begin
select @retVal = count(HostName) from DVLP_QES.dbo.UserHostName where HostName = HOST_NAME()
if (@retVal > 0)
begin
insert into MatlabSearchPath select * from inserted
end
else
begin
insert into MatlabSearchPath select * from inserted where inserted.userName <> 'Default'
end
end
端
更新
我应该提到这个表上有3个触发器,一个是触发器,另一个触发器是删除&amp;最后一个是更新
答案 0 :(得分:1)
您的触发器执行以下操作:
计算您要插入的记录,其中userName等于&#39;默认&#39; 在您的情况下,计数是1。 注意你的整理 - 如果它区分大小写,你将跳过整个代码分支。
如果输入if分支,则下一步触发检查是否在UserHostName表中有行,其中HostName等于客户端的主机名;注意你不要认为它应该是你的服务器的主机名或类似的东西
如果您输入TRUE-branch,它应该将所有内容插入表中;但是,如果没有,它不应该插入任何东西。当然,除非排序规则区分大小写,否则还原逻辑。
我是你,我会将PRINT语句添加到触发器中,以确保它是如何执行的。
create trigger trDefaultPathInsert on DVLP_QES.dbo.MatlabSearchPath
instead of insert
as
begin
declare @defCount int
declare @retVal int
select @defCount = count(userName) from inserted where userName = 'Default'
PRINT '@defCount'
PRINT @defCount
if (@defCount > 0)
begin
select @retVal = count(HostName) from DVLP_QES.dbo.UserHostName where HostName = HOST_NAME()
PRINT '@retVal'
PRINT @retVal
if (@retVal > 0)
begin
PRINT 'TRUE-BRANCH'
insert into MatlabSearchPath select * from inserted
end
else
begin
PRINT 'FALSE-BRANCH'
insert into MatlabSearchPath select * from inserted where inserted.userName <> 'Default'
end
end
修改的
似乎有关受影响的行的消息无法在触发器内进行控制。即使触发器开头的标准SET NOCOUNT ON
也无法停止显示。这给了我一个概念,即消息是通过用X行调用它来成功完成触发的结果,其中X最终将在X row(s) affected
消息中。
This SO question进一步证实了这个问题。
答案 1 :(得分:0)
此处的情况如果第一条消息指示cero是因为而不是触发器用于忽略您发送的插入,而是在触发器中执行操作
您可以使用管理工作室调试代码