2010-05-24 61 views
3

我在一个相当新的项目中,我们仍在修改Oracle 11g数据库表的设计。因此,我们经常删除并重新创建表,以确保我们的表创建脚本在我们进行更改时按预期工作。如何使一个GRANT持久存储被删除并重新创建的表?

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

GRANT ALL ON schema_two.SomeTable TO schema_one; 

我们的问题是,每次我们作出改变到我们的数据库设计,并希望删除并重新创建数据库表,我们GRANT -ed到schema_one走了,当表被删除的访问。因此,这又产生了另一个烦人的步骤,其中我们必须使用管理员帐户登录,以在每次删除和重新创建这些表中的一个时重新访问该访问权GRANT

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

回答

3

你可以授予select any table,insert any table等schema_one,但这似乎是矫枉过正,并不会反映你在生产(希望)做什么。为什么不能在创建表的同时发布授权,而以schema_two身份登录?我一直在创建脚本中这样做,并且只能使用管理员帐户授予第三方或系统权限。我怀疑我错过了一些东西...

+1

是的 - 对我们来说,这是表格创建脚本的一部分。我还必须错过问题描述中的某些内容。 – DaveE 2010-05-24 22:31:34

+0

谢谢;我实际上不知道“SELECT ANY TABLE”特权;我知道没有''GRANT ALL ON schema_one。*''等同于我没有意识到我可以给这样的模式权限。 – 2010-05-25 14:04:13

+1

虽然这可能不是你想要制作的东西,或者应该假设你会被允许拥有,除非你拥有该env。我不确定为什么你不能在创建表的同一个脚本中进行授权; schema_two应该能够将自己的对象的权限授予任何人,并且当您进行生产安装时,它也会为您节省一个步骤。有没有理由不能这样做? – 2010-05-25 14:15:06

3

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

下一个最好的选择可能是创建一个视图,该视图引用了occaisionally消失的表 - 视图不会消失,如果在这种情况下表不存在,则会出现错误。 IE:

CREATE VIEW table_vw AS 
    SELECT t.* 
    FROM DISAPPEARING_TABLE t 

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

+2

IIRC:如果将列添加到基础表中,SELECT *将无法帮助 - Oracle将*转换为创建点处的列列表 - 将其他列添加到基础表中随后不会将其添加到视图和删除列使视图无效 – 2010-05-24 22:39:25

+0

简单地执行ALTER TABLE语句的问题是我们想重新测试我们的表创建脚本以及最初使用数据填充新创建的表的脚本。理想情况下,我们希望每当我们做出更改以尽早检测破损时就进行测试。这就是为什么我们想要删除并重新创建我们的表格。 – 2010-05-24 23:12:21

1

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

6

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

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语句添加到该步骤?

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

1

我建议你可以给你用来创建表的帐户提供运行授权的能力。

分享和享受。

相关问题