而不是触发结果输出
Posted
技术标签:
【中文标题】而不是触发结果输出【英文标题】:instead of trigger result output 【发布时间】:2015-08-10 12:35:33 【问题描述】:我已经创建了我的第一个触发器。请参阅下面的触发器代码部分。
触发器和结果都符合预期,除了一件事。
因此,当我运行下面的代码时,它不会将值插入到我的表中,因此记录数保持不变。
insert into MatlabSearchPath(directory, userName)
values('madeup', 'default')
在消息窗口中,虽然我得到了两行。我不明白为什么我看到两行,尤其是 1 行受到影响 - 我的表中的记录数没有改变?
(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 个触发器,一个是上面的触发器,另一个是删除,最后一个是更新
【问题讨论】:
你确定这两条消息来自同一个插入吗?如果您清除消息窗口并运行插入,您是否总是会收到两条消息? @MarkLeiber 是的,我已经清除了消息窗口并且总是收到两条消息 【参考方案1】:您的触发器执行以下操作:
计数您尝试插入的记录,其中 userName 等于“默认” 在您的情况下,计数为 1。 注意您的排序规则 - 如果区分大小写,您将跳过整个代码分支。
如果您进入 if 分支,接下来的触发器检查是 UserHostName 表中是否存在 HostName 等于客户端主机名的行;请注意,您认为它不应该是服务器的主机名或类似的名称
如果您输入 TRUE 分支,它应该将所有内容都插入到表中;但是,如果没有,它不应该插入任何东西。当然,除非排序规则区分大小写,否则请还原逻辑。
我是你,我会在触发器中添加 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进一步确认了问题。
【讨论】:
我得到 defcount =1, retval = 0,然后打印“FALSE-BRANCH”,然后是通常的 0 行受影响,然后是 1 行受影响 嗯,那很容易,不是吗?您从UserHostName
中选择的内容不返回任何内容。这就是为什么没有插入行。
是的,受影响的 0 行是正确的,我所期待的是,但它之后的 1 行受影响,我不明白
实际上,SQL Server 似乎总是将这种消息作为 INSTEAD OF 触发器的最后附加。因此,如果您有 10 行要插入,它将打印出“10 行受影响”。很奇怪。
是的,这很奇怪,不会发现的!谢谢!【参考方案2】:
如果第一条消息指示cero的情况是因为instead of trigger用于忽略您发送的插入并执行触发器中的内容
您可以使用管理工作室调试您的代码
【讨论】:
以上是关于而不是触发结果输出的主要内容,如果未能解决你的问题,请参考以下文章
Kernprof(line_profiler):如何将结果输出为文本而不是二进制文件
如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果
SQL Server Management Studio - 网格结果另存为 .CSV - 如何输出文本而不是 UTF-16 (Unicode)