如何在Oracle 11g中创建用户并授予权限

80

有人能指导我如何在Oracle 11g中创建一个用户,并仅授予该用户执行一个特定存储过程以及该存储过程中的表的权限。

我不太确定该怎么做!

9个回答

86

连接为 SYSTEM 用户。

CREATE USER username IDENTIFIED BY apassword;

GRANT CONNECT TO username;

GRANT EXECUTE on schema.procedure TO username;

您可能还需要:

GRANT SELECT [, INSERT] [, UPDATE] [, DELETE] on schema.table TO username;

对于存储过程使用的任何表格。


6
根据Oracle版本的不同,“CONNECT”角色拥有的权限可能比名字所示的要多得多。我更愿意授予“CREATE SESSION”权限。 - Justin Cave
我使用的版本是11g。 - Andy5
2
"CONNECT、RESOURCE和DBA这些角色是为了与以前版本兼容而提供的...Oracle建议您设计自己的数据库安全角色,而不是依赖于这些角色。这些角色可能不会被未来版本的Oracle数据库自动创建。" - dani herrera
3
你不必在任何表上授予选择、插入、更新或删除的权限。使用存储过程的一个优点是可以保持表的"未授权"状态,并在存储过程层面控制对它们的访问。 - Dawood ibn Kareem
3
"GRANT EXECUTE on schema.procedure TO username;" 返回一个错误,显示"ERROR at line 1: ORA-04042: procedure, function, package, or package body does not exist"。意思是没有找到相应的存储过程、函数、包或包体。请检查该对象是否存在并确保您有访问权限。 - Tasdik Rahman

26

按照以下步骤在Oracle中创建用户。
--以System用户身份连接

CONNECT <USER-NAME>/<PASSWORD>@<DATABASE NAME>;

--创建用户查询

CREATE USER <USER NAME> IDENTIFIED BY <PASSWORD>;

--提供角色

GRANT CONNECT,RESOURCE,DBA TO <USER NAME>;

--提供特权

GRANT CREATE SESSION, GRANT ANY PRIVILEGE TO <USER NAME>;
GRANT UNLIMITED TABLESPACE TO <USER NAME>;

--提供对表格的访问。

GRANT SELECT,UPDATE,INSERT ON <TABLE NAME> TO <USER NAME>;

在Oracle 11g中,是使用"grant dba"还是"grant sysdba"? - jondinham
2
ORA-00990错误:在“GRANT CREATE SESSION GRANT ANY PRIVILEGE TO <USER NAME>;”上缺少或无效的权限。 - Nicolas Mommaerts
4
“session”后面应该加上一个逗号。 - Karthik Prasad
2
--在这里加逗号:GRANT CREATE SESSION, GRANT ANY PRIVILEGE TO <USER NAME> 以授予权限;我已经编辑过,但由于某些原因被拒绝了。 - ghost_1989
1
连接,资源,DBA。这些角色是为了与Oracle数据库的早期版本兼容而提供的... Oracle建议您设计自己的数据库安全角色,而不是依赖于这些角色。这些角色可能不会被未来版本的Oracle数据库自动创建。 - Jeff Puckett
这授权远不止于 OP 的“仅授予用户执行一个特定存储过程的能力”。 - Jeff Puckett

21

Oracle文档内容全面、在线且免费。建议您学会使用它。您可以在此处找到CREATE USER的语法以及GRANT的语法

为了连接数据库,我们需要授予用户CREATE SESSION特权

为了允许新用户对存储过程拥有权限,我们需要授予EXECUTE特权。授权者必须是以下之一:

  • 存储过程所有者
  • 授予该存储过程执行权限并带有WITH ADMIN选项的用户
  • 授予GRANT ANY OBJECT特权的用户
  • DBA或其他超级用户账户。

请注意,通常情况下,我们不需要授予存储过程使用的对象的权限即可使用该过程。默认权限是,在执行存储过程时,我们将以存储过程所有者相同的权限执行,并在执行存储过程时继承其权限。这由AUTHID子句涵盖。默认值为definer(即过程所有者)。仅当AUTHID设置为CURRENT_USER(即调用者,也就是我们的新用户)时,我们需要授予存储过程使用的对象的权限。了解更多


11

不要在测试和生产环境中使用这些方法。以下步骤仅建议用于本地环境。对于我的本地主机,我是通过以下步骤创建用户的:

重要提示:请使用SYSTEM用户凭据创建您的用户,否则在同一数据库上运行多个应用程序时可能会遇到问题。

 CONNECT SYSTEM/<<System_User_Password>>@<<DatabaseName>>; -- connect db with username and password, ignore if you already connected to database.

然后运行以下脚本

CREATE USER <<username>> IDENTIFIED BY <<password>>; -- create user with password
GRANT CONNECT,RESOURCE,DBA TO <<username>>; -- grant DBA,Connect and Resource permission to this user(not sure this is necessary if you give admin option)
GRANT CREATE SESSION TO <<username>> WITH ADMIN OPTION; --Give admin option to user
GRANT UNLIMITED TABLESPACE TO <<username>>; -- give unlimited tablespace grant

编辑:如果您遇到Oracle ora-28001密码已过期的问题,以下操作可能有用:

select * from dba_profiles;-- check PASSWORD_LIFE_TIME 
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED; -- SET IT TO UNLIMITED

2
连接,资源,DBA。这些角色是为了与Oracle数据库的早期版本兼容而提供的... Oracle建议您设计自己的数据库安全角色,而不是依赖于这些角色。这些角色可能不会被未来版本的Oracle数据库自动创建。 - Jeff Puckett

4
作为之前在评论中多次提到的,Oracle不鼓励使用CONNECTRESOURCEDBA角色。
要创建角色和被授予此角色的用户,您必须连接为SYS。您可以使用SQL Developer或SQL * Plus,根据自己的喜好选择。不要忘记在登录字符串中提及SYSDBA角色。connect_identifier使用不同的语法。
sqlplus sys/<<password>>@<<connect_identifier>> as sysdba

假设您拥有一个类似于"Oracle Technology Network Developer Day"提供的12cR1虚拟机。连接字符串可能是(用于连接到提供的PDB):

sqlplus sys/oracle@127.0.0.1/orcl as sysdba
sqlplus sys@"127.0.0.1/orcl" as sysdba -- to avoid putting the pw in clear

请注意,在Unix下,引号必须被转义,否则它们将被shell消耗。因此,"变成\"
然后,您创建角色MYROLE并授予其他角色或特权。我添加了几乎最少的内容来做一些有趣的事情:
create role myrole not identified;
grant create session to myrole;
grant alter session to myrole;
grant create table to myrole;

下一步,您需要创建用户MYUSER。在identified by后面的字符串是区分大小写的密码。其余部分则不区分大小写。您还可以使用SQL限定符(用引号"括起来)代替常规标识符,后者会转换为大写并受到一些限制。配额可以是unlimited而不是20m
create user myuser identified by myuser default tablespace users profile default account unlock;
alter user myuser quota 20m on users;
grant myrole to myuser;

最终,您将作为新用户连接。
请注意,您还可以更改默认配置文件或提供另一个配置文件以自定义某些设置,例如密码过期时间、允许的登录失败尝试次数等。

2
CREATE USER USER_NAME IDENTIFIED BY PASSWORD;
GRANT CONNECT, RESOURCE TO USER_NAME;

1
连接,资源,DBA。这些角色是为了与Oracle数据库的早期版本兼容而提供的... Oracle建议您设计自己的数据库安全角色,而不是依赖于这些角色。这些角色可能不会被未来版本的Oracle数据库自动创建。 - Jeff Puckett

0

-1 这是谷歌搜索结果中排名靠前的文章之一,但它提供的建议是最糟糕的。这个例子会将用户设置为具有完全权限的数据库管理员。这就是“如何放弃对你的数据库的控制权”。 - Devon_C_Miller

0
第一步:
使用System/Password连接到数据库;
第二步:
创建用户username,密码为password;(语法)
例如:create user manidb identified by mypass;
第三步:
授予用户名为connect和resource的权限;(语法)
例如:grant connect,resource to manidb;

-2
  • 步骤1。

    create user raju identified by deshmukh;

  • 步骤2。

    grant connect , resource to raju;

  • 步骤3。

    grant unlimitted tablespace to raju;

  • 步骤4。

    grant select , update , insert , alter to raju;


1
连接,资源,DBA。这些角色是为了与Oracle数据库的早期版本兼容而提供的... Oracle建议您设计自己的数据库安全角色,而不是依赖于这些角色。这些角色可能不会被未来版本的Oracle数据库自动创建。 - Jeff Puckett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接