【问题标题】:Oracle 10g - An invisible column?Oracle 10g - 一个不可见的列?
【发布时间】:2009-01-19 22:26:35
【问题描述】:

是否可以“隐藏”Oracle 10g 数据库中的列,或者完全阻止数据插入?我们希望现有的 INSERT 语句仍然有效,但不为特定列插入信息。此外,列掩码或任何类型的加密都不是首选。

不确定是否可行,但在此先感谢。

【问题讨论】:

    标签: oracle


    【解决方案1】:

    如果您只需要停止插入数据,您可以创建一个 BEFORE INSERT FOR EACH ROW 触发器,在保存行之前清除插入到列中的任何值。

    您还可以对安全性(也包括视图)执行各种其他操作,以防止在特定情况下来自特定用户的插入/选择,但这些可能不会让现有的插入继续工作。

    【讨论】:

    • 这很可能是我们想要采取的路线...您知道原始 INSERT 事件是否会被记录,或者只是触发事件?谢谢!
    • 取决于“记录”的含义...就事务日志而言,它应该只是一个 INSERT,其值由触发器修改(即,不会有两个条目),但我想较低级别的审计日志或其他东西可能会在某处记录原始版本......
    • 您的问题是关于 10g,但要知道 12c 添加了对不可见列的显式支持。参见例如blog.contractoracle.com/2013/06/…。 SQL*Plus 12c 有一个选项可以显示它们(毕竟不是完全不可见):tkyte.blogspot.fr/2013/07/12c-sql-plus-new-things.html.
    【解决方案2】:

    使用 Oracle 特性虚拟专用数据库 (VPD),您可以定义哪些用户可以更改以及哪些用户可以选择一列。虚拟私有数据库也称为细粒度访问控制 (FGAC)。

    【讨论】:

      【解决方案3】:

      我知道如何隐藏该列。

      • 你使用

        设置未使用

        将一列或多列标记为未使用的选项。

      • 你使用 DROP

        未使用的列

        删除标记为未使用的列的选项。

      ALTER TABLE emp
      设置未使用(姓氏);

      ALTER TABLE emp
      删除未使用的列;

      【讨论】:

        【解决方案4】:

        重命名原始表,使用原始表名创建视图,但只选择要显示的列。

        引用现有表重新编译代码。

        【讨论】:

          【解决方案5】:

          将您的授权设置为您允许更新或插入的每个项目怎么样

          grant select on emp to scott;
          
          grant update (column1, column2), insert (column1) on emp to scott
          

          【讨论】:

            猜你喜欢
            • 2015-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-05-04
            相关资源
            最近更新 更多