防止用户在 MySQL 中删除超过一定数量的行

gal*_*tor 5 mysql trigger

问题:

  • 我有一个带行的表,没什么特别的
  • 当数据库用户删除一行时,它应该增加一个数字
  • 数据库用户最多只能删除表中的 3 行
  • 数据库管理员应该能够向数据库用户添加更多“删除令牌”

我知道我应该有一个BEFORE DELETE触发器来查看用户是否可以删除一行,以及一个AFTER DELETE触发器来增加用户删除的行数。

我应该如何存储有关数据库用户从该特定表中删除了多少行的信息,以及如何允许数据库管理员向用户添加更多“删除令牌”。

我想创建一个表来存储它,但我想知道没有表是否有不同的方法来做到这一点?这可能听起来像一个奇怪的问题,但我只是想弄清楚更高级的东西是如何工作的。

Rol*_*DBA 2

对于这种粒度,您需要进行相当复杂的设置。

我正在考虑建议几件事

建议#1:使用存储过程进行专门的 DML

必须对每个用户的 DELETE 数量进行微观管理以减轻 DML 不应成为针对特定表的 DELETE 的以服务器为中心的功能。这应该仍然是一个以应用程序为中心的功能。因此,创建一个可以管理 DELETE 数量的存储过程。

建议#2:使用 BLACKHOLE 存储引擎

使用真实表的 DELETE 的任何审计跟踪都可能会产生局部磁盘瓶颈,而这种瓶颈很难控制。如果审计跟踪记录在 BLACKHOLE 表中,则将显着减少任何磁盘 I/O 问题,否则这些问题将导致丑陋的后果。如果写入 BLACKHOLE 表,审计跟踪数据将写入哪里?这导致...

建议#3:使用 MySQL 复制

MySQL 复制有何帮助?假设该表名为mydb.audittrail. 如果mydb.audittrail在 Prod Server 上使用 BLACKHOLE,它可以复制到具有 MyISAM 的 Slave mydb.audittrail。这将是实际审计数据的位置。唯一的缺点是添加磁盘 I/O 以将审计跟踪信息写入二进制日志。您可以通过将二进制日志存储在 SSD 或 RAM 磁盘上来进一步减少这种情况。

请参阅我对使用多个触发器是否正常? 有关使用 BLACKHOLE 存储引擎和 MySQL 复制进行审计跟踪记录这一概念的更多信息。