如果主键更改,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
会导致FKCONSTRAINT
s失败。我怀疑您正在尝试解决一个不存在的问题。
另外,您在此处标记了 [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'”错误?