【问题标题】:Oracle: Updates only allowed with comment甲骨文:只允许有评论的更新
【发布时间】:2013-02-05 22:14:33
【问题描述】:

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

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

【问题讨论】:

  • 如果一个视图包含一个“comment”列并且有一个在主表上执行更新并将评论插入到审计表中的触发器而不是触发器。然后您可以撤销对表的更新权限,并且所有更新都必须通过视图。不知道这样的触发器是否可能。
  • 好的,但我也需要像上面这样的程序,或者?
  • 没有过程,只有触发器。
  • @a_horse_with_no_name 是的。

标签: oracle triggers comments procedure


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    • 2021-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多