我在Schema A中有表。我使用模式A中的表在Schema B中创建了视图。
我想授予用户权限,以便从Schema B中的视图中选择数据。
为了实现这个目的,我知道我们必须在Schema A中的表上为用户B启用grant选项。 但我想在一个脚本中执行此操作(此脚本必须位于模式B中)。有没有办法使用架构A的用户名/密码来执行此操作。
答案 0 :(得分:4)
想要使用单个脚本来部署更改并不罕见。问题是,这样的脚本需要由高级用户运行,因为它需要具有任何级别的系统权限。这通常意味着DBA帐户,最好是应用程序帐户,但SYSTEM或SYS。
所以你想要的脚本看起来像这样:
grant select on user_a.t23 to user_b
/
grant select on user_a.t42 to user_b
/
create view user_b.v_69 as
select t23.col1, t42.col2
from user_a.t42
join user_a.t23
on (t42.id = t23.id)
/
grant select on user_b.v_69 to user_c
/
一个常见的情况是我们有一套单独的脚本,这些脚本已被编写为由不同的用户运行,但我们现在需要捆绑到单个部署中。原始脚本不包含模式名称,并且有很多很好的理由可以解释为什么我们不想在脚本中对它们进行硬编码。
构建主脚本的一种方法是使用更改CURRENT_SCHEMA语法:
alter session set current_schema=USER_A
/
@run_grants_to_userb.sql
alter session set current_schema=USER_B
/
@create_view69.sql
@run_grants_to_userc.sql
我们仍然需要DBA用户来运行主脚本。切换当前模式的一个优点是它允许我们部署像数据库链接这样的对象,这些对象通过语法的怪癖在其声明中不能具有模式名称。一个问题是用户不会改变,因此使用USER伪列的脚本可能会产生不需要的结果。
答案 1 :(得分:4)
只需运行查询
GRANT INSERT,SELECT,UPDATE,DELETE ON TABLE 1 TO SCHEMA 2p>
答案 2 :(得分:2)
仅在某个时刻以用户A身份进行连接。如果你真的想要,你仍然可以在一个脚本中完成:
connect userA/passwordA
grant select on my_table to userB;
connect userB/passwordB
create view my_view as select * from userA.my_table;
当然,现在你有一个脚本,它会向可以阅读它的任何人公开两组用户凭据。例如,在做生产之前要特别注意的事情。
如果您希望其他用户能够从视图中进行选择,则无需向userA.my_table
授予他们明确的权限;只要视图所有者可以看到基础表,其他用户只需要能够看到该视图。这通常是一点(或其中之一),因为您可以将视图限制为仅将基础表中的选定数据公开给世界其他地方。我假设您有理由不在架构A中创建视图。
我不确定你是否真的要求用管理员选项授予用户B选择权,以便用户B可以将用户A表上的选择授予其他人。如果这是可能的,那听起来不是一个好主意,并且视图无需工作。
答案 3 :(得分:2)
让用户A在他的桌子上选择授予B并包括'授权选项'。
作为用户A:
GRANT select ON table TO user_b WITH GRANT OPTION;
让用户B授予用户A选择他的观点并包括'授权选项'。
作为用户B:
GRANT select ON view TO user_a WITH GRANT OPTION;
作为用户A:
GRANT select on user_b.view TO user_c;
这允许用户A将此授权传递给其他用户。