而不是触发结果输出

时间:2015-08-10 12:35:34

标签: sql sql-server triggers

我创建了第一个触发器。请参阅下面的触发器的代码部分。

触发器和结果符合预期,除了一件事。

因此,当我运行下面的代码时,它不会将值插入到我的表中,因此记录数保持不变。

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;最后一个是更新

2 个答案:

答案 0 :(得分:1)

您的触发器执行以下操作:

  1. 计算您要插入的记录,其中userName等于&#39;默认&#39; 在您的情况下,计数是1。 注意你的整理 - 如果它区分大小写,你将跳过整个代码分支。

  2. 如果输入if分支,则下一步触发检查是否在UserHostName表中有行,其中HostName等于客户端的主机名;注意你不要认为它应该是你的服务器的主机名或类似的东西

  3. 如果您输入TRUE-branch,它应该将所有内容插入表中;但是,如果没有,它不应该插入任何东西。当然,除非排序规则区分大小写,否则还原逻辑。

  4. 我是你,我会将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是因为而不是触发器用于忽略您发送的插入,而是在触发器中执行操作

您可以使用管理工作室调试代码