【发布时间】: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
【问题讨论】:
-
您的触发器假设 DML 语句只能影响一行;那不是真的。 DML 语句可以影响无限数量的行。只要您在
INSERT/UPDATE中有 2 行或更多行,这将不会像您预期的那样运行。 -
至于错误,它似乎很简单。没有
TRIGGER[dbo].[informacao]到ALTER。但是,您需要修复触发器以便处理多行。 Bad habits to kick : abusing triggers -
@Larnu 我创建了函数来进行这些验证,但我不知道如何将它们与约束相关联
-
函数做哪些验证?这没有意义。
标签: sql sql-server database triggers