4

我正在进行一个相当新的项目,我们仍在修改 Oracle 11g 数据库表的设计。因此,我们经常删除和重新创建我们的表,以确保我们的表创建脚本在我们进行更改时按预期工作。

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

GRANT ALL ON schema_two.SomeTable TO schema_one;

我们的问题是,每次我们对数据库设计进行更改并希望删除并重新创建我们的数据库表时,当表被删除时,我们的访问权限GRANTschema_one消失了。因此,这创建了另一个烦人的步骤,其中我们必须使用管理员帐户登录,以便GRANT每次删除并重新创建这些表中的一个时重新访问。

这没什么大不了的,但我很想从我们的开发和测试过程中消除尽可能多的步骤。有没有办法以GRANT这样的方式访问表,即GRANT-ed 权限在表被删除然后重新创建后仍然存在?如果这是不可能的,那么有没有更好的方法来解决这个问题?

4

5 回答 5

7

所以授权被撤销的原因是新表是一个不同的对象。

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?为什么你有一个管理员帐户来代替呢?我假设您正在连接schema_two以运行 DROP 和 CREATE 语句。为什么不直接将 GRANT 语句添加到该步骤?

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

于 2010-05-25T02:31:45.037 回答
5

您可以将 , 等授予select any tableschema_one insert any table,但这似乎有点矫枉过正,并且不会反映您在生产中所做的事情(希望如此)。为什么不能在创建表的同时发出授权,同时以 schema_two 身份登录?我一直在创建脚本中这样做,并且只需要使用管理员帐户来授予第三方或系统权限。我怀疑我错过了什么...

于 2010-05-24T22:28:49.693 回答
3

你在做什么不能被 ALTER TABLE 语句处理?

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

CREATE VIEW table_vw AS
  SELECT t.* 
    FROM DISAPPEARING_TABLE t

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

于 2010-05-24T22:25:22.660 回答
1

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

于 2010-05-24T22:48:04.800 回答
1

我建议您也可以让用于创建表的帐户也能够运行授权。

分享和享受。

于 2010-05-25T11:57:25.907 回答