【问题标题】:SQL Update trigger to raise an error if primary key changed如果主键更改,SQL 更新触发器会引发错误
【发布时间】:2023-03-20 12:10:02
【问题描述】:

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

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。

标签: sql sql-server tsql triggers


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-22
    • 2014-10-09
    • 2016-09-02
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-03
    相关资源
    最近更新 更多