我正处于一个相当新的项目中,我们仍在修改Oracle 11g数据库表的设计。因此,我们经常删除并重新创建表,以确保每当我们进行更改时,我们的表创建脚本都按预期工作。
我们的数据库包含2个模式。一个模式有一些带有INSERT
触发器的表,这些表有时会将数据复制到第二个模式中的表中。这要求我们使用诸如sysdba
和GRANT
之类的管理员帐户登录数据库,以访问第二个模式上必要表格的第一个模式,例如。
GRANT ALL ON schema_two.SomeTable TO schema_one;
我们的问题是每次我们对数据库设计进行更改并希望删除并重新创建数据库表时,我们GRANT
- schema_one
的访问权限在表格中消失了被丢弃了。因此,这会产生另一个恼人的步骤,其中我们必须使用管理员帐户登录,以便每次删除并重新创建其中一个表时重新GRANT
访问权限。
这不是一个大问题,但我希望从我们的开发和测试程序中尽可能多地消除步骤。是否有任何方式GRANT
以这样的方式访问表:GRANT
- ed权限在表被删除然后重新创建后仍然存在?如果这是不可能的,那么还有更好的方法吗?
答案 0 :(得分: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语句添加到该步骤?
因为授予对象权限与安装表一样是安装的一部分。所以你应该有一个完成所有事情的过程。
答案 1 :(得分:5)
您可以将select any table
,insert any table
等授予schema_one,但这似乎有点过分,并不会反映您在制作中所做的事情(希望如此)。为什么不能在创建表的同时发布授权,同时以schema_two身份登录?我总是在创建脚本中完成此操作,并且只需使用管理员帐户授予第三方或系统权限。我怀疑我错过了什么......
答案 2 :(得分:3)
ALTER TABLE语句无法处理您正在做什么?
下一个最佳选项可能是创建一个引用偶尔消失的表的视图 - 视图不会消失,如果在这种情况下表不存在,则只会出现错误。 IE:
CREATE VIEW table_vw AS
SELECT t.*
FROM DISAPPEARING_TABLE t
使用*表示法也意味着您不必不断更新视图以公开表中的列。
答案 3 :(得分:1)
您可以使用DDL触发器或每隔几分钟运行一次的批处理作业,自动授予权限。但这有点安全漏洞,并不代表生产。
答案 4 :(得分:1)
我建议您也可以使用您用来创建表格的帐户来运行授权。
分享并享受。