代码之家  ›  专栏  ›  技术社区  ›  Eli Courtwright

如何使正在删除和重新创建的表的授权保持不变?

  •  3
  • Eli Courtwright  · 技术社区  · 16 年前

    我在一个全新的项目中,我们仍在修改Oracle11g数据库表的设计。因此,我们经常删除并重新创建表,以确保我们的表创建脚本在进行更改时按预期工作。

    我们的数据库由2个模式组成。一个架构有一些表 INSERT 触发器有时会导致数据被复制到第二个模式中的表中。这要求我们使用管理员帐户登录数据库,例如 sysdba GRANT 访问第一个架构到第二个架构上的必要表,例如

    GRANT ALL ON schema_two.SomeTable TO schema_one;
    

    我们的问题是,每当我们对数据库设计进行更改并希望删除并重新创建数据库表时,访问 补助金 -ED schema_one 桌子掉了就走了。因此,这就创建了另一个恼人的步骤,其中我们必须使用管理帐户登录才能重新- 补助金 每次删除并重新创建其中一个表时的访问。

    这不是一个大问题,但我希望尽可能地从我们的开发和测试过程中消除许多步骤。有什么办法吗 补助金 以这样一种方式访问表 补助金 -ED权限在被删除然后重新创建的表中仍然有效吗?如果这不可能的话,还有更好的方法来解决这个问题吗?

    5 回复  |  直到 16 年前
        1
  •  4
  •   Alex Poole    16 年前

    你可以给予 select any table , insert any table 等等,但这似乎是多余的,不会反映出你在生产中所做的(希望如此)。为什么您不能在创建表的同时发出授权,而以模式二登录?我总是在创建脚本中这样做,并且只需要使用一个管理帐户来授予第三方或系统特权。我怀疑我错过了什么…

        2
  •  6
  •   APC    16 年前

    因此,撤销授予的原因是新表是另一个对象。

    SQL> select object_id from user_objects
      2  where object_name = 'T72'
      3  /
    
     OBJECT_ID
    ----------
        659195
    
    SQL> drop table t72
      2  /
    
    Table dropped.
    
    SQL> create table t72 (id number)
      2  /
    
    Table created.
    
    SQL> select object_id from user_objects
      2  where object_name = 'T72'
      3  /
    
     OBJECT_ID
    ----------
        659212
    
    SQL>
    

    授权是针对对象的,而不是对象的名称。

    关于您的问题,我不理解的是:您有一个流程,它将删除并重新创建 schema_two . 为什么这个过程不将这些表的授予特权授予 schema_one ?你为什么要有一个管理员帐户来代替?我想你的联系方式是 图式二 运行DROP和CREATE语句。为什么不将GRANT语句添加到该步骤中呢?

    因为在对象上授予权限和创建表一样是安装的一部分。所以你应该有一个做所有事情的过程。

        3
  •  3
  •   OMG Ponies    16 年前

    你在做什么,不能用alter table语句来处理?

    下一个最好的选择可能是创建一个视图,引用偶尔会消失的表-视图不会消失,如果表不存在于这种情况下,您只会得到一个错误。IE:

    CREATE VIEW table_vw AS
      SELECT t.* 
        FROM DISAPPEARING_TABLE t
    

    使用*表示法还意味着您不必不断更新视图来公开表中的列。

        4
  •  1
  •   Gary Myers    16 年前

    您可以有一个DDL触发器或一个批处理作业,每隔几分钟运行一次,它自动授予权限。但这有点安全漏洞,不代表生产。

        5
  •  1
  •   Bob Jarvis - Слава Україні    16 年前

    我建议您也给用于创建表的帐户运行赠款的能力。

    分享和享受。