问题可能有点奇怪。但我正在寻找一种只有在用户发表评论时才允许对表进行更新的方法。更新普通表时,注释应保存在第二个审计表中
我认为在oracle中没有办法在执行“update table set ...”时用户如何发表评论。
所以我创建了自己的过程,用户可以将语句和注释作为参数传递。触发器可以阻止没有此过程的更新。
create or replace
PROCEDURE Update_Table(stmt varchar2, comment varchar2) AS
BEGIN
Insert into audit_table values(stmt, comment);
Execute immediate stmt;
END Update_Table;
我对这个解决方案并不满意。所以也许有更简单的解决方案。
答案 0 :(得分:5)
标准方法是阻止用户针对基表发出UPDATE
语句。通常,您将撤消UPDATE
权限,然后创建一个存储过程(可能在一个包中以及在该表上执行其他类型的DML操作的过程,例如INSERT
),您授予用户特权使用。然后,您的用户将调用存储过程,传入注释,并且存储过程将在实际更新表之前实现所需的任何验证。
如果出于某种原因,您确实需要让用户能够发出明确的UPDATE
语句,您是否可以要求他们在发出UPDATE
语句之前调用存储过程?如果是这样,您可以创建一个包含注释的包级变量的包和一个设置注释的过程,然后在表上创建一个从该包级变量读取数据的触发器,如果不是则抛出异常设置,并做你需要的任何记录。
另一种选择是将comment
列实际添加到表本身以存储上次修改的注释,然后创建一个语句级触发器,将注释写入单独的表并对其进行约束。强制comment
设置的表。
您也可以像@a_horse_with_no_name建议撤消对表的访问权限,创建包含comment
列的视图,然后编写一个INSTEAD OF UPDATE
触发器,检查该语句是否正在设置{ {1}}列到适当的值,然后针对基表发出适当的DML。