是否可以禁用通过全局会话或服务器变量在全局级别更新主键列的可能性?
还是我需要手动检查每个表中的更新触发器?
作为对 spencer7593 答案的补充,如果您自己管理数据库的用户,则始终可以使用以下方法“保护”某些列REVOKE
:
REVOKE UPDATE (primary_key_col) ON db.tbl FROM 'user'@'localhost'
不,不可能使用全局、服务器、会话等来禁止对属于“主键”约束的列的更新。多变的。
如果您想阻止 UPDATE 语句进行更改,您可以尝试在每个表上使用 BEFORE UPDATE 触发器来强制执行该更改。
SET NEW.primary_key_col = OLD.primary_key_col;
跟进:
dmjm 说:“我宁愿抛出一个错误......”
要使用 MySQL 5.5 或更高版本从触发器引发错误,您可以使用新SIGNAL
语法。
http://dev.mysql.com/doc/refman/5.5/en/signal.html
对于 MySQL 5.1 或更早版本,没有直接的方法来引发错误,因此开发人员实施了“错误”代码,执行该代码以(实际上)保证引发错误。
IF ( NEW.primary_key_col <> OLD.primary_key_col ) THEN
UPDATE `Error: primary_key_col modification not allowed` SET dummy=0 WHERE dummy=-1;
END IF;