我有一个名为customer_transactions
的表,其中包含amount
类型DECIMAL
的列(非符号)。在customer
表中有一个名为account_balance
的列,该列必须始终等于客户的customer_transactions.amount
行的总和。
有没有办法通过拒绝除了通过触发器(最好是特别命名的触发器)之外的任何其他更新amount
列的方法来强制执行此相等性?或者也许还有另一种强制执行此操作的方法,我不知道?
答案 0 :(得分:0)
您是否能够管理服务器上的权限?我从来没有尝试过,但我相信在MySQL 5.1及更高版本中,您可以从应用程序的数据库用户撤消customer.amount
列的任何写权限,同时保留读取列和执行表触发器的权限。提供用于创建触发器的用户具有修改amount
列的权限,较少特权的用户应该仍然可以使用触发器。
除非我误解了文件......这是可能的。
答案 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
列。