【问题标题】:Triggers in SQL Server - error "Invalid Object Name"SQL Server 中的触发器 - 错误“无效的对象名称”
【发布时间】:2020-10-17 11:59:30
【问题描述】:

我创建了此触发器,但出现错误

无效的对象名称“dbo.informacao”

我删除了另一个触发器,但它的名称不同。能有什么问题?查询编译没有错误,所以我假设我没有做错任何事

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[informacao]
ON [dbo].[FolhaAuxiliar]
AFTER INSERT, UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    DECLARE @codOperacao int, @codFuncionario int, 
            @codEquipamento int, @dataInicio datetime, 
            @dataFim datetime, @produto int, @folha int,
            @quantP int, @quantD int, @setorFuncionario int

    SELECT 
        @codOperacao = i.CodOperação, 
        @codFuncionario = i.CodFuncionário, 
        @codEquipamento = i.CodEquipamento, 
        @dataInicio = i.DataInicio, 
        @dataFim = i.DataFim,  
        @produto = i.Produto,
        @folha = i.Folha,
        @quantP = i.qntdproduzida,
        @quantD = i.qntddesperdiçada
    FROM 
        inserted i

    SELECT @setorFuncionario = f.Setor
    FROM Funcionário f
    WHERE f.CodFuncionario = @codFuncionario

    IF (@setorFuncionario != 2)
    BEGIN
        RAISERROR('O funcionário não pertence ao setor das operações', 10,1);
        ROLLBACK TRANSACTION;
        RETURN;
    END
    ELSE IF(@codEquipamento IN (SELECT f.CodEquipamento FROM FolhaAuxiliar f WHERE DataFim IS NULL))
    BEGIN
        RAISERROR('O equipamento já está a ser utilizado', 10,1);
        ROLLBACK TRANSACTION;
        RETURN;
    END
    ELSE IF (@codFuncionario IN (SELECT f.CodFuncionário FROM FolhaAuxiliar f WHERE DataFim IS NULL))
    BEGIN
        RAISERROR('O funcionário já se encontra a realizar outra operação', 10,1);
        ROLLBACK TRANSACTION;
        RETURN;
    END
    ELSE
    BEGIN
        INSERT INTO [FolhaAuxiliar](CodOperação, CodFuncionário, CodEquipamento, DataInicio, Produto, Folha, qntdproduzida, qntddesperdiçada, DataFim)
            SELECT 
                CodOperação, CodFuncionário, CodEquipamento, DataInicio, 
                Produto, Folha, qntdproduzida, qntddesperdiçada, DataFim
            FROM 
                inserted
    END
END

【问题讨论】:

  • 看看这是否有帮助:stackoverflow.com/questions/27156053/…
  • 您的触发器假设 DML 语句只能影响一行;那不是真的。 DML 语句可以影响无限数量的行。只要您在 INSERT/UPDATE 中有 2 行或更多行,这将不会像您预期的那样运行。
  • 至于错误,它似乎很简单。没有TRIGGER [dbo].[informacao]ALTER。但是,您需要修复触发器以便处理多行。 Bad habits to kick : abusing triggers
  • @Larnu 我创建了函数来进行这些验证,但我不知道如何将它们与约束相关联
  • 函数做哪些验证?这没有意义。

标签: sql sql-server database triggers


【解决方案1】:

您不能在数据库中创建两个或多个具有相同名称(包括模式)的对象。只有先创建的对象才能更改。

如果不确定,也可以使用以下方法:

CREATE OR ALTER TRIGGER [dbo].[informacao]
...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-22
    • 2018-08-08
    • 1970-01-01
    相关资源
    最近更新 更多