当前位置: 首页 > 知识库问答 >
问题:

Northwind中的SQL Server触发器:不工作的代码

佴波鸿
2023-03-14

下面是说明:创建Changelog表后,在Employee表上创建一个用于更新的触发器。使用此触发器监视Payrate列,如果员工的Payrate发生更改,请让触发器在Changelog表中插入一行,其中包含适当的数据。[使用函数suser_sname()让用户进行更改,并将其插入到用户列中。]

CREATE TRIGGER PayRate_Change 
ON Employees
AFTER UPDATE
AS
BEGIN
    DECLARE @EmpID int;
    DECLARE @OldRate money;
    DECLARE @NewRate money;

    IF UPDATE (PsyRate)
        SELECT @EmpID = (SELECT @EmpID FROM inserted)

    SELECT @OldRate = (SELECT PsyRate FROM deleted)
    SELECT @NewRate = (SELECT PsyRate FROM inserted)

    INSERT INTO [dbo].[ChangeLog](EmpID, ChangedBy, DateChanged, OldRate, NewRate)
    VALUES (@EmpID, suser_sname(), getdate(), @OldRate, @NewRate);

    PRINT 'The PayRate was changed from "' + @OldRate + '" to "' + @NewRate + '"'
END

UPDATE Employees
SET PsyRate = PsyRate * 1.2
WHERE LastName ='King';

有人能帮忙吗?

共有1个答案

吕皓
2023-03-14

触发器应该更像这样:

CREATE TRIGGER PayRate_Change ON Employees AFTER UPDATE
AS BEGIN
    INSERT INTO ChangeLog (EmpID, CHangedBy, DateChanged, OldRate, NewRate)
        SELECT i.empid, suser_sname(), getdate(), d.PsyRate, i.PsyRate
        FROM inserted i JOIN
             deleted d
             ON i.empid = d.empid AND
                d.PsyRate <> i.PsyRate;  -- does not take `NULL`s into account

END;

最重要的变化是,您不再假设只更改一行--因此代码不再有等待发生的bug。这是在SQL Server中编写触发器的一个非常重要的部分。不要假设inserteddeleted只有一行。

 类似资料:
  • 我写了这个触发器,但它不工作,我执行了这个错误: 11:24:11创建触发器check_venduti在INSERT ON venduti之后,对每一行开始SELECT count(*)作为num_rows FROM prodotto(其中COD_PRODOTTO=New.COD_PRODOTO如果numrows<0,则发出“Error”信号,结束错误代码:1064)。您的SQL语法有错误;检查与

  • 我正在为项目存储库设置Github操作。 工作流程包括以下步骤: 构建docker形象 将图像推送到容器注册表中 推出Kubernetes部署 然而,我有两种不同的Kubernetes部署:一种用于开发,另一种用于生产。因此,我还有两个Github操作工作流。 每次推送提交时,都会触发Github开发操作工作流: 但我不希望在我的生产工作流程中出现这种情况。我需要一个手动触发器,比如“发送到生产”

  • 本文向大家介绍触发器的作用?相关面试题,主要包含被问及触发器的作用?时的应答技巧和注意事项,需要的朋友参考一下 答:触发器是一中特殊的存储过程,主要是通过事件来触发而被执行的。它可以强化约束,来维护数据的完整性和一致性,可以跟踪数据库内的操作从而不允许未经许可的更新和变化。可以联级运算。如,某表上的触发器上包含对另一个表的数据操作,而该操作又会导致该表触发器被触发。

  • 本文向大家介绍SqlServer实现类似Oracle的before触发器示例,包括了SqlServer实现类似Oracle的before触发器示例的使用技巧和注意事项,需要的朋友参考一下 1. 插入数据前判断数据是否存在 2. 删除表中数据时需要先删除外键表的数据

  • 我尝试在远程主机上脱机评测Java 8应用程序,不允许直接访问。(hadoop集群上的Flink纱线作业)。 我能够通过JProfiler从JProfiler for linux 64中导出相关的JProfiler库以进行脱机调试- 然后,我在我的主机上创建了一个带有2个计时器触发器的会话。一个在2分钟后激活跟踪,另一个在22分钟后停止所有跟踪并保存快照。当我在JProfiler GUI中通过SS

  • 我很难找到关于如何设置onEdit触发器的好资源。我有一个只想在编辑特定工作表时运行的函数。例如,假设我有表1、表2、表3、表4、表5。我的脚本从工作表2、3、4中提取数据并填充工作表1。我只希望在有人编辑工作表2、3或4时运行脚本。如何设置此触发器?