0

这个问题可能有点奇怪。但我正在寻找一种仅在用户发表评论时才允许更新表格的方法。更新普通表时,注释应保存在第二个审计表中。
我认为在 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;

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

4

1 回答 1

5

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

如果出于某种原因您确实需要让用户能够发出显式UPDATE语句,您是否可以要求他们在发出UPDATE语句之前调用存储过程?如果是这样,您可以创建一个包,其中包含一个用于注释的包级变量和一个设置注释的过程,然后在表上创建一个触发器,从这个包级变量中读取数据,如果不是则抛出异常设置,并执行您需要的任何日志记录。

另一种选择是将comment列实际添加到表本身以存储最后修改的注释,然后创建一个语句级触发器,将注释写入单独的表,并在表上设置一个强制comment设置的约束。

正如@a_horse_with_no_name 建议的那样,您还可以撤消对表的访问权限,创建一个包含该comment列的视图,然后编写一个INSTEAD OF UPDATE触发器来检查该语句是否将comment列设置为适当的值,然后针对基础发出适当的 DML表。

于 2013-02-20T19:15:37.450 回答