【问题标题】:Sql Trigger on a view does not getting triggered视图上的 Sql Trigger 不会被触发
【发布时间】:2017-04-03 14:46:24
【问题描述】:

当数据被插入到这个特定视图中时,我有一个视图从其他视图获取数据,如下所示需要插入表 vendas ref(nvarchar(50)) 和 Estado(bool)。

ALTER TRIGGER [dbo].[TGR_VENDAS] 
ON [dbo].[VendasFinal]
INSTEAD OF INSERT
AS
BEGIN
    DECLARE
    @Ref  nvarchar(50),
@EstadoString nvarchar(50)

SELECT @Ref = i.ref, @EstadoString = i.ESTADO 
FROM inserted i

if(@EstadoString = 'Em Aberto')
    BEGIN
        INSERT INTO dbo.Vendas
            (ref, Estado)
        VALUES
            (@Ref ,0);
    END
ELSE
    BEGIN
        INSERT INTO dbo.Vendas
            (ref, Estado)
        VALUES
            (@Ref ,1);
    END
END

它在 MS Sql Server 11.0 上运行。 提前致谢。

【问题讨论】:

  • 每个语句触发一次,而不是每个行触发一次。 inserted 可以包含 0、1 或 多个 行。这是此触发器的第一个明显问题。但是,您没有说明您是否收到错误或您如何确定触发器“没有被触发”,因此难以提供进一步的帮助。
  • 每个语句的触发是什么意思?我只是编辑问题。
  • 表示inserted表包含所有插入的行。这不是当时的一排。
  • 临时将此代码“SELECT (at)Ref = i.ref, (at)EstadoString = i.ESTADO FROM insert i”更改为“SELECT @Ref = convert(nvarchar(50), count( *)) FROM inserted i",您将看到触发器是如何基于 SET 的
  • 你可以运行游标,但为什么呢?这只不过是基于单个集合的插入。

标签: sql-server triggers sql-server-2012


【解决方案1】:

这里不需要光标。您只需要使用 case 表达式。您发布的触发器可以简化为此。它处理任意数量的行和现有代码中的逻辑。

ALTER TRIGGER [dbo].[TGR_VENDAS] 
ON [dbo].[VendasFinal]
INSTEAD OF INSERT
AS
BEGIN

     INSERT INTO dbo.Vendas
    (
        ref
        , Estado
    )
    SELECT i.ref
        , case when i.ESTADO = 'Em Aberto' then 0 else 1 end
    from inserted i

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    相关资源
    最近更新 更多