如果主键更改,SQL 更新触发器会引发错误

Posted

技术标签:

【中文标题】如果主键更改,SQL 更新触发器会引发错误【英文标题】:SQL Update trigger to raise an error if primary key changed 【发布时间】:2021-10-17 22:46:24 【问题描述】:

我有一个输入数据的表,并为该表定义了一个主键。如果用户正在更改此表的主键,我想创建一个触发器以引发错误。下面的代码似乎不起作用。我做错了什么?

ALTER TRIGGER ztr_ro_update
ON ztb_ro
AFTER UPDATE
AS
BEGIN
    IF (SELECT Name FROM inserted) <> (SELECT Name FROM ztb_ro)
    BEGIN
        RAISERROR('Can not change primary key',16,1)
    END
    ELSE
    BEGIN
        UPDATE ztb_ro
        SET Modified_On = GETDATE(),
            Modified_By = SYSTEM_USER
        FROM ztb_ro A
        JOIN inserted B ON A.Name = B.Name
    END
END

【问题讨论】:

您的触发器假定UPDATE 中只有一行会受到影响;一个致命的缺陷。 一般来说PK的值很难改变,就好像它被FK引用一样,那么UPDATE会导致FKCONSTRAINTs失败。我怀疑您正在尝试解决一个不存在的问题。 另外,您在此处标记了 [tsql] 和 [postgresql-triggers]; PostgreSQL 不使用 T-SQL。 如果您更改了主键,您的数据模型完整性就会受到损害,这可能不是您要解决的问题。你用的是哪个数据库平台,你的标签是矛盾的。 我正在使用 TSQL。 【参考方案1】:

这是文档中的示例:

USE AdventureWorks2012;  
GO  
IF EXISTS (SELECT name FROM sys.objects  
      WHERE name = 'reminder' AND type = 'TR')  
   DROP TRIGGER Person.reminder;  
GO  
CREATE TRIGGER reminder  
ON Person.Address  
AFTER UPDATE   
AS   
IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )  
BEGIN  
RAISERROR (50009, 16, 10)  
END;  
GO  
-- Test the trigger.  
UPDATE Person.Address  
SET PostalCode = 99999  
WHERE PostalCode = '12345';  
GO  

UPDATED()

【讨论】:

以上是关于如果主键更改,SQL 更新触发器会引发错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 raise_application_error 的 PL SQL 触发器会引发错误。

为啥我的 PL/SQL 触发器会引发“错误(2,2):PL/SQL:语句被忽略”和“错误(2,5):PLS-00204:函数或伪列'EXISTS'”错误?

引发错误,防止 MySQL 触发器中的表更新

使用此触发器 oracle 数据库更改表

PLSQL 触发器引发应用程序错误不起作用

更新时SQL违反主键约束