我使用系统用户使用以下语句创建了两个用户。我希望ADMIN_USER具有所有权限,此用户将创建一组表。我有一个外部进程,它为ADMIN_USER创建的两个表提供数据。我的问题是如果ADMIN_USER创建了所有表结构,我如何给EXTERNAL_USER提供读取,更新和插入TABLE_A和TABLE_B的能力?当我以ADMIN_USER或SYSTEM用户身份登录时,我会运行grant语句吗?我使用的是Oracle 11g。
以SYSTEM用户身份登录时创建:
create user "ADMIN_USER" identified by "p@ssword123";
grant create session, grant any privilege to ADMIN_USER;
create user "EXTERNAL_USER" identified by "p@ssword321";
以ADMIN_USER身份登录:
GRANT create session, select, update, insert
ON TABLE_A
TO EXTERNAL_USER;
GRANT create session, select, update, insert
ON TABLE_B
TO EXTERNAL_USER;
答案 0 :(得分:2)
首先,您非常不希望授予ADMIN_USER
GRANT ANY PRIVILEGE
权限。用户不需要任何权限即可授予用户拥有的表的对象级权限。 ANY
权限非常强大。可以向其他用户授予任何权限的用户可以使任何用户(包括用户自己)成为DBA。那不是你想要的。
实际上,作为SYSTEM
,您希望授予您希望用户拥有的系统权限。作为对象所有者,您将授予对象级权限。
作为SYSTEM
CREATE USER admin_user
IDENTIFIED BY "p@ssword123"
DEFAULT TABLESPACE tablespace_name
QUOTA 10M ON tablespace_name;
CREATE USER external_user IDENTIFIED BY "p@ssword321";
GRANT CREATE SESSION, CREATE TABLE TO admin_user;
GRANT CREATE SESSION TO external_user;
作为ADMIN_USER
<<create the tables>>
GRANT select, insert, update
ON table_a
TO external_user;
GRANT select, insert, update
ON table_b
TO external_user;
DBA还应该能够授予对象级权限。通常最好使用对象所有者帐户。