gpt4 book ai didi

mysql - 是否可以禁止 MySQL 行修改?

转载 作者:行者123 更新时间:2023-11-29 16:06:06 27 4
gpt4 key购买 nike

我有一个 MySQL 表,存储了一些我不想被任何人修改的数据。这意味着即使是数据库管理员也不应该允许修改它。有什么方法可以禁止包括数据库管理员在内的所有人修改表行?

我研究过,这可以部分通过读/写锁来实现。但是,数据库管理员仍然可以使用持有锁的用户名登录并利用它。

我的目标是禁止包括数据库管理员在内的所有人修改表记录。有什么办法可以用 MySQL 实现这一点吗?

最佳答案

如前所述,将事情限制在管理员范围内是很困难的,因为它几乎可以做所有事情。

您可以创建一个阻止更新的触发器。我有 2 个解决方案,有 2 个不同的触发器

示例 1

此版本不会发送错误,但对架构修改很敏感。它还影响“0线”

-- Table
CREATE TABLE not_updatable(
id int unsigned not null auto_increment primary key,
data varchar(50)
);

-- Trigger
DELIMITER $$

CREATE TRIGGER not_updatable_after_update
BEFORE UPDATE
ON not_updatable
FOR EACH ROW
BEGIN
SET NEW.id=OLD.id, NEW.data=OLD.data;
END$$

DELIMITER ;

结果:

mariadb@localhost:test> CREATE TABLE not_updatable(
id int unsigned not null auto_increment primary key,
data varchar(50)
);
Query OK, 0 rows affected
Time: 0.236s
mariadb@localhost:test> CREATE TRIGGER not_updatable_after_update
-> BEFORE UPDATE
-> ON not_updatable
-> FOR EACH ROW
-> BEGIN
-> SET NEW.id=OLD.id, NEW.data=OLD.data;
-> END;
Query OK, 0 rows affected
Time: 0.070s
mariadb@localhost:test> insert into not_updatable(data) values ('test 1'), ('test 2');
Query OK, 2 rows affected
Time: 0.043s
mariadb@localhost:test> select * from not_updatable;
+------+--------+
| id | data |
|------+--------|
| 1 | test 1 |
| 2 | test 2 |
+------+--------+
2 rows in set
Time: 0.004s
mariadb@localhost:test> update not_updatable set data = 'test 3' where id = 1;
Query OK, 0 rows affected
Time: 0.001s
mariadb@localhost:test> select * from not_updatable;
+------+--------+
| id | data |
|------+--------|
| 1 | test 1 |
| 2 | test 2 |
+------+--------+
2 rows in set
Time: 0.003s

示例 2

这会引发错误,因此对攻击者来说更容易看到

-- Table
CREATE TABLE not_updatable(
id int unsigned not null auto_increment primary key,
data varchar(50)
);

-- Trigger
DELIMITER $$

CREATE TRIGGER not_updatable_after_update
BEFORE UPDATE
ON not_updatable
FOR EACH ROW
BEGIN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Don''t try to cheat !';
END$$

DELIMITER ;

结果:

mariadb srumeu@localhost:test> drop trigger not_updatable_after_update;
Query OK, 0 rows affected
Time: 0.000s
mariadb srumeu@localhost:test> CREATE TRIGGER not_updatable_after_update
-> BEFORE UPDATE
-> ON not_updatable
-> FOR EACH ROW
-> BEGIN
-> SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Don''t try to cheat !';
-> END;
Query OK, 0 rows affected
Time: 0.078s
mariadb srumeu@localhost:test> update not_updatable set data = 'test 3' where id = 1;
(1644, "Don't try to cheat !")
mariadb srumeu@localhost:test> select * from not_updatable;
+------+--------+
| id | data |
|------+--------|
| 1 | test 1 |
| 2 | test 2 |
+------+--------+
2 rows in set
Time: 0.014s

关于mysql - 是否可以禁止 MySQL 行修改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55734949/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com