Max*_*xii 0 oracle triggers comments procedure
问题可能有点奇怪.但我正在寻找一种只有在用户发表评论时才允许对表进行更新的方法.更新普通表时,注释应保存在第二个审计表中.
我认为在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;
Run Code Online (Sandbox Code Playgroud)
我对这个解决方案并不满意.所以也许有更简单的解决方案.
标准方法是防止用户UPDATE针对基表发出语句.通常,您将撤销UPDATE权限,然后创建一个存储过程(可能在一个包中以及执行其他类型的DML操作的过程,例如INSERT在该表上),您授予用户使用的权限.然后,您的用户将调用存储过程,传入注释,并且存储过程将在实际更新表之前实现所需的任何验证.
如果由于某种原因您确实需要让用户能够发出显式UPDATE语句,您是否可以要求他们在发出UPDATE语句之前调用存储过程?如果是这样,您可以创建一个包含注释的包级变量的包和一个设置注释的过程,然后在表上创建一个从该包级变量读取数据的触发器,如果不是则抛出异常设置,并执行您需要的任何记录.
另一种选择是将comment列实际添加到表本身以存储最后修改的注释,然后创建一个语句级触发器,将注释写入单独的表和表上强制comment设置的约束.
您也可以像@a_horse_with_no_name建议的那样撤销对表的访问权限,创建包含该comment列的视图,然后编写一个INSTEAD OF UPDATE触发器,检查该语句是否将comment列设置为适当的值,然后针对该基础发出相应的DML表.
| 归档时间: |
|
| 查看次数: |
121 次 |
| 最近记录: |