【发布时间】: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