有没有办法将列定义为“仅通过触发器可更新”以强制执行完整性?

时间:2014-03-21 23:59:48

标签: mysql sql triggers rdbms data-integrity

我有一个名为customer_transactions的表,其中包含amount类型DECIMAL的列(非符号)。在customer表中有一个名为account_balance的列,该列必须始终等于客户的customer_transactions.amount行的总和。

有没有办法通过拒绝除了通过触发器(最好是特别命名的触发器)之外的任何其他更新amount列的方法来强制执行此相等性?或者也许还有另一种强制执行此操作的方法,我不知道?

2 个答案:

答案 0 :(得分:0)

您是否能够管理服务器上的权限?我从来没有尝试过,但我相信在MySQL 5.1及更高版本中,您可以从应用程序的数据库用户撤消customer.amount列的任何写权限,同时保留读取列和执行表触发器的权限。提供用于创建触发器的用户具有修改amount列的权限,较少特权的用户应该仍然可以使用触发器。

除非我误解了文件......这是可能的。

MySQL 5.1 Create Trigger documentation

答案 1 :(得分:0)

不,但你可以创造这样的效果。

如果account_balance列为not null且应用程序需要插入行,请为account_balance列定义默认值。

创建一个视图,其中包含除account_balance计算 account_balance列以外的所有列:

create view customer_transactions_2 as -- call it whatever you want
select id, col1, col2, ..., account_balance + 0 as account_balance
from customer_transactions

为您的应用程序提供可供使用的视图。他们将能够使用表可以执行所有操作,除了更新account_balance值(您无法通过非原始列的视图写入数据库)

您在基表上的触发器将能够更新account_balance列。