关于 Oracle 12c 中的用户
Posted
技术标签:
【中文标题】关于 Oracle 12c 中的用户【英文标题】:Regarding Users in Oracle 12c 【发布时间】:2013-11-21 07:03:53 【问题描述】:我在我的系统上安装了一个 Oracle 12c 数据库。我有一个需要访问数据库的应用程序。
以前在 Oracle 11g 中,我使用以下命令创建用户。
create user name identified by name;
grant connect,create session,resource,create view to name;
谁能告诉我如何根据我的上述要求在 Oracle 12c 中创建用户? 我使用了以下语句,但我的安装显示了一个致命错误,说
FATAL ERROR - java.sql.SQLException: ORA-01950: no privileges on tablespace 'USERS'
以下是使用的语句。
create user c##test1 identified by test1 container = ALL;
grant connect,create session,resource,create view to test1;
【问题讨论】:
1) 您是否创建并配置了可插拔数据库? 2)第二个create user
语句创建普通用户帐户(似乎您想创建一个本地帐户),这意味着您没有连接到可插拔数据库。为了创建一个本地用户帐户,您需要连接到一个可插入的数据库(如果它已经创建并且已经适当地配置了对它的访问)。
我已经创建了一个可插拔的数据库...您如何确认我要创建一个本地用户帐户而不是普通用户帐户。直到现在我无法理解创建一个本地/公共
c##
前缀仅用于 12c 中的普通用户帐户。您将无法使用该前缀创建本地用户。因此,如果您的语句成功执行,则意味着您已连接到容器数据库 (CDB) 并创建了一个通用用户帐户。现在,为了创建本地用户帐户,您需要连接到 PDB(例如sys/pass@PDB_TNS_NAME as sysdba
),然后尝试创建一个用户,该用户是该 PDB 的本地用户。
另一方面,如果您需要使用普通用户帐户才能连接到任何可插拔数据库并做一些有用的事情,那么在您创建普通用户之后,您必须登录(例如as sysdba
)到每个 PDB,该普通用户需要访问,并向该普通用户授予适当的角色和权限。
如果您授予(已弃用)resource
角色,则无需同时授予 connect
和 create session
或 create view
- 这些已经包含在内。
【参考方案1】:
最佳实践是创建一个表空间并将其分配给用户。
只是为了让用户名和表空间使用相同的名称更容易理解
CREATE BIGFILE TABLESPACE C##1
DATAFILE '/path/to/datafile/C##1.dbf'
SIZE 10M AUTOEXTEND ON NEXT 5M MAXSIZE UNLIMITED
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO
NOLOGGING;
--创建用户
CREATE USER C##1
IDENTIFIED BY password
DEFAULT TABLESPACE C##1
QUOTA UNLIMITED ON C##1;
【讨论】:
上面提到的错误是不是和表空间有关? 我想是的。如果您在创建表空间时未指定表空间,则会使用名为 USER 的默认表空间。从它的错误输出来看,它看起来像那样。表空间可能已超出其内存限制。我不确定。 创建新用户的用户/模式在“USER”表空间上没有任何前置权限。 ALTER USER你还应该给用户一个默认表空间的配额:
CREATE USER name
IDENTIFIED BY name
DEFAULT TABLESPACE users
TEMPORARY TABLESPACE temp
QUOTA 50M /* or any other number that makes sense */ ON users
GRANT CONNECT, CREATE SESSION, RESOURCE, CREATE VIEW TO name;
【讨论】:
配额条款?是的。虽然如果您不想开始管理配额,可以指定QUOTA UNLIMITED
。【参考方案3】:
试试这个:
#!/bin/bash
USERVALID=false;
if [ -z $1 ]; then
echo -e "\nThis script will create a new common user in Oracle"
fi
while [[ $USERVALID == false ]]; do
if [ -z $1 ]; then
echo -e "Username must start with 'c##' or 'C##'\n"
read -p "Enter a username: " NEWUSER
else
NEWUSER=$1
fi
if [[ $NEWUSER == c##* ]]
then
USERVALID=true;
elif [[ $NEWUSER == C##* ]]
then
USERVALID=true;
else
USERVALID=false;
echo -e "\nInvalid username";
if [ ! -z $1 ]; then
echo -e "Username must start with 'c##' or 'C##'\n"
exit 0
fi
fi
done
while [[ -z $NEWPWD ]]; do
if [ -z $2 ]; then
read -p "Enter a password: " NEWPWD
else
NEWPWD=$2
fi
if [[ -z $NEWPWD ]]
then
echo -e "Password must not be NULL"
fi
done
get_user_status ()
sqlplus -s / as sysdba <<!
set heading off
set feedback off
set pages 0
select username from all_users where username = '$NEWUSER^^';
!
USERDROP=$(get_user_status)
if [[ $USERDROP =~ $NEWUSER^^ ]]; then
echo -e "\nUser already exists...\nAttempting to drop user\n"
echo -e "DROP USER $NEWUSER CASCADE;" | sqlplus -s / as sysdba
USERDROP=$(get_user_status)
if [[ $USERDROP =~ $NEWUSER^^ ]]; then
echo -e "Please ensure user is disconnected from the database before proceeding.\n"
exit 0
fi
fi
echo -e "CREATE USER $NEWUSER IDENTIFIED BY $NEWPWD;" | sqlplus -s / as sysdba
USERDROP=$(get_user_status)
if [[ ! $USERDROP =~ $NEWUSER^^ ]]; then
echo -e "You are a bad person.\n"
exit 0
fi
echo -e "GRANT CREATE SESSION TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE PROCEDURE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE SEQUENCE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE DATABASE LINK TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE TABLE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE VIEW TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT CREATE MATERIALIZED VIEW TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT QUERY REWRITE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT SELECT ANY TABLE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT SELECT ON SYS.V_\$SESSION TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT EXECUTE ON SYS.DBMS_LOCK TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "GRANT UNLIMITED TABLESPACE TO $NEWUSER;" | sqlplus -s / as sysdba
echo -e "\nAll done!\n"
【讨论】:
注意:脚本会在不提示的情况下删除现有用户。以上是关于关于 Oracle 12c 中的用户的主要内容,如果未能解决你的问题,请参考以下文章