Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server触发器不工作_Sql_Sql Server_Events_Triggers - Fatal编程技术网

SQL Server触发器不工作

SQL Server触发器不工作,sql,sql-server,events,triggers,Sql,Sql Server,Events,Triggers,我有两个触发器,没有人在工作,但我不知道为什么,难道每个人都不能帮我吗: 插入: CREATE TRIGGER [dbo].[afterInsert] ON [dbo].[LinhasVenda] FOR INSERT AS BEGIN DECLARE @IdVenda INT, @PrecoTotalSIva MONEY, @PrecoTotalCIva MONEY SELECT @PrecoTotalSI

我有两个触发器,没有人在工作,但我不知道为什么,难道每个人都不能帮我吗:

插入:

CREATE TRIGGER [dbo].[afterInsert]

ON [dbo].[LinhasVenda]

FOR INSERT

AS

BEGIN
    DECLARE
        @IdVenda INT,
        @PrecoTotalSIva MONEY,
        @PrecoTotalCIva MONEY
    SELECT
        @PrecoTotalSIva = PrecoTotalSIva,
        @PrecoTotalCIva = PrecoTotalCIva
    FROM
        INSERTED
    UPDATE Vendas SET ValorSIva = ValorSIva + @PrecoTotalSIva,
    ValorCIva = ValorCIva + @PrecoTotalCIva WHERE
    IdVenda = @IdVenda
END
删除:

CREATE TRIGGER afterDelete

ON LinhasVenda

FOR DELETE
AS
BEGIN
    DECLARE
        @IdVenda INT,
        @IdArtifo INT,
        @PrecoTotalSIva MONEY,
        @PrecoTotalCIva MONEY

    SELECT
        @PrecoTotalSIva = PrecoTotalSIva,
        @PrecoTotalCIva = PrecoTotalCIva
    FROM
        DELETED

    UPDATE Vendas SET ValorSIva = ValorSIva - @PrecoTotalSIva,
    ValorCIva = ValorCIva - @PrecoTotalCIva WHERE
    IdVenda = @IdVenda
END

两个触发器都有两个缺陷。SELECT语句未分配WHERE子句中使用的@IdVenda值。此外,这些触发器不适用于多行INSERT/UPDATE语句。我建议您加入Insert/Delete,这将解决这两个问题。下面是一个示例,假设LinhasVenda表中的列名也命名为IdVenda

CREATE TRIGGER [dbo].[afterInsert]
ON [dbo].[LinhasVenda]
FOR INSERT
AS
BEGIN 

UPDATE v
SET
      ValorSIva = v.ValorSIva + i.PrecoTotalSIva
    , ValorCIva = v.ValorCIva + i.PrecoTotalCIva 
FROM Vendas AS v
JOIN INSERTED AS i ON
    i.IdVenda = v.IdVenda;

END;
GO

CREATE TRIGGER afterDelete
ON LinhasVenda 
FOR DELETE 
AS 
BEGIN

UPDATE v
SET
      ValorSIva = v.ValorSIva - d.PrecoTotalSIva
    , ValorCIva = v.ValorCIva - d.PrecoTotalCIva 
FROM Vendas AS v
JOIN DELETED AS d ON
    d.IdVenda = v.IdVenda;
END;
GO

“不起作用”不够精确,到底出了什么问题?太多了,你救了mt的命:)