2013-02-20 61 views
0

这个问题可能有点奇怪。但是我正在寻找一种方式,只有当用户发表评论时才允许更新表格。更新普通表时,应将注释保存在第二个审计表中。
我认为oracle中没有办法在执行“update table set ...”时用户可以发表评论。

因此,我创建我自己的过程,其中用户可以传递语句和评论作为参数。没有这个过程的更新被一个触发器阻止。Oracle:更新只允许评论

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; 

我对这个解决方案并不满意。所以也许有更简单的解决方案。

+2

那么包含“注释”列的视图又如何,而不是在主表上进行更新并将评论插入到审计表中的触发器。然后,您可以撤销表上的更新权限,所有更新都必须通过该视图。不知道这样的触发器是否可能。 – 2013-02-20 19:06:16

+0

好的,但我还需要像上面的程序,或? – Maxii 2013-02-20 19:11:25

+0

没有程序,只有触发器。 – 2013-02-20 19:36:57

回答

5

标准方法是阻止用户针对基表发出UPDATE语句。通常,您将撤消UPDATE特权,然后创建一个存储过程(大概在一个程序包中,以及执行其他类型DML操作(如该表上的INSERT)的过程),以授予用户使用权限。然后你的用户将调用存储过程,传递一个注释,并且存储过程将在实际更新表之前实现所需的任何验证。

如果由于某些原因,您确实需要让用户能够发出明确的UPDATE语句,您是否需要在发出UPDATE语句之前调用存储过程?如果是这样,您可以创建一个包含评论的包级别变量的包以及一个设置评论的过程,然后在从该包级别变量读取数据的表上创建一个触发器,如果​​不是,则会抛出异常设置,并做任何你需要的日志。

另一种方法是实际将comment列添加到表本身,以存储最后修改的注释,然后创建一个语句级触发器,将注释写入单独的表和表中的强制要设置的comment

您也可以作为@a_horse_with_no_name建议,撤销对表的访问,创建一个包含comment列的视图,然后写一个INSTEAD OF UPDATE触发器检查语句是否在comment列设置为一个适当的值,然后针对基表发布适当的DML。

+0

这听起来很不错。谢谢 – Maxii 2013-02-20 19:19:17