Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将MySQL行设置为只读?_Mysql_Sql_Database - Fatal编程技术网

如何将MySQL行设置为只读?

如何将MySQL行设置为只读?,mysql,sql,database,Mysql,Sql,Database,我在表格中有一行,我永远不想被改变 是否可以将MySQL行设置为只读,以使其无法以任何方式更新?如果是,怎么做 如果没有,是否可以在该行的某一列中设置永久值,使其无法更改?如果是,怎么做 谢谢。这可能是业务逻辑,它可能不属于您的数据存储层。然而,它仍然可以通过使用 您可以创建更新前触发器,该触发器在锁定记录即将更新时引发错误;由于在执行操作之前发生错误,MySQL将停止继续执行该操作。如果还希望防止删除记录,则需要在删除之前创建一个类似的触发器 要确定记录是否已锁定,可以创建布尔锁定列: 请注意

我在表格中有一行,我永远不想被改变

是否可以将MySQL行设置为只读,以使其无法以任何方式更新?如果是,怎么做

如果没有,是否可以在该行的某一列中设置永久值,使其无法更改?如果是,怎么做


谢谢。

这可能是业务逻辑,它可能不属于您的数据存储层。然而,它仍然可以通过使用

您可以创建更新前触发器,该触发器在锁定记录即将更新时引发错误;由于在执行操作之前发生错误,MySQL将停止继续执行该操作。如果还希望防止删除记录,则需要在删除之前创建一个类似的触发器

要确定记录是否已锁定,可以创建布尔锁定列:

请注意,这是在MySQL 5.5中引入的。在早期版本中,您必须执行一些导致MySQL引发错误的错误操作:我经常调用一个不存在的过程,例如调用raise_error

我无法在此表上创建其他列,但该行在其中一列中有一个唯一的id,因此在这种情况下我将如何执行此操作

同样,如果您必须将此逻辑放在存储层中,并且无法通过PK以外的任何方式识别锁定的记录,则可以将测试硬编码到触发器中;例如,要锁定id_column=1234的记录:


但是这太可怕了,我会尽可能避免它。

不,没有只读行。但是您可以设置MySQL帐户,使特定用户没有更新/删除权限。Poss dup:@Marc B:那么我提到的两个选项都不可用?请确认,因为您提到的用户权限解决方案无法解决我的问题。很遗憾。@Kris:这个问题完全不是重复的。我的问题完全不同。@Rahul:我需要更新表中的其他行,所以这不是一个选项。谢谢你提供了一个非常有趣的解决方案。我无法在此表上创建额外的列,但该行在其中一列中有一个唯一的id,因此我如何在该场景中执行此操作?@Programmer:只需在触发器的IF语句中测试该id:IF OLD.column'unique_id',然后…现在有一个非常规的解决方案。我喜欢+请记住,mysql中每个表的每个事件只能有一个触发器,因此如果您已经有或将来需要另一个触发器。。。你必须把它们合并成一个。@eggyal:好的。三个问题:1是什么?什么是旧的。?什么是分隔符?再次感谢@程序员:是空安全相等比较运算符;旧的和新的是触发器中可用的关键字,用于在操作之前/之后访问受影响记录的值-请参阅;DELIMITER指定一个新的语句分隔符,以便命令本身包含常用的;分隔符被视为单个语句-您可以选择除;;以外的字符序列;;如果你愿意的话。
ALTER TABLE my_table ADD COLUMN locked BOOLEAN NOT NULL DEFAULT FALSE;

DELIMITER ;;

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.locked THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.locked THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;

DELIMITER ;

UPDATE my_table SET locked = TRUE WHERE ...;
DELIMITER ;;

CREATE TRIGGER foo_upd BEFORE UPDATE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot update locked record';
END IF;;

CREATE TRIGGER foo_del BEFORE DELETE ON my_table FOR EACH ROW
IF OLD.id_column <=> 1234 THEN
  SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Cannot delete locked record';
END IF;;

DELIMITER ;