oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle创建本地用户、授予权限

Oracle数据库创建本地用户、授予权限、创建表并插入数据实例代码

作者:fengyehongWorld

这篇文章主要介绍了Oracle多租户架构中用户类型的分类、创建用户的方法、表空间管理、用户权限分配、登录配置以及脚本创建等操作的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一. 用户的种类

⏹在 Oracle 多租户架构中(从 Oracle 12c 开始),用户分为

⏹数据库刚被安装后,并没有本地用户,我们需要通过system用户登录Oracle之后,创建本地用户。

二. 切换session为PDB

SHOW CON_NAME;:显示当前会话所连接的容器名称

apluser@ubuntu24-01:~$ sqlplus system/oracle@192.168.118.137/XE

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Jan 1 09:00:28 2025
Version 21.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Tue Dec 31 2024 23:15:56 +09:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL>
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
CDB$ROOT
SQL>

⏹查看数据库中所有的PDB

-- 方式1
SQL> SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS;

 PDB_ID PDB_NAME   STATUS
------- ---------- ----------
      3 XEPDB1     NORMAL
      2 PDB$SEED   NORMAL
      
-- 方式2
SQL> SELECT NAME FROM V$PDBS;

NAME
--------------
PDB$SEED
XEPDB1

⏹切换当前用户的sessionPDB

-- 切换session到根容器
SQL> ALTER SESSION SET CONTAINER = CDB$ROOT;

Session altered.

-- 切换session到PDB
SQL> ALTER SESSION SET CONTAINER = XEPDB1;

Session altered.

-- 查看当前容器名称
SQL> SHOW CON_NAME;

CON_NAME
------------------------------
XEPDB1
SQL>

三. 创建用户并授予权限

⏹创建用户并指定密码

SQL> CREATE USER db_user IDENTIFIED BY oracle;

User created.

⏹为创建的用户赋予权限

-- 授予用户登录的权限
GRANT CREATE SESSION TO db_user;

-- 授予用户创建 表,视图,存储过程,序列对象的权限
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE, CREATE SEQUENCE TO db_user;

⏹查看创建好的PDB用户

SQL> SELECT USER_ID, USERNAME, ACCOUNT_STATUS, COMMON, TO_CHAR(LAST_LOGIN, 'YYYY/MM/DD HH24:MI:SS') LAST_LOGIN FROM DBA_USERS WHERE COMMON = 'NO';

 USER_ID USERNAME   ACCOUNT_STATUS   COM  LAST_LOGIN
-------- ---------- ---------------- ---- -------------------
     108 PDBADMIN   OPEN             NO
     110 DB_USER    OPEN             NO   

四. 创建表空间

-- 创建默认表空间并指定表空间文件
CREATE TABLESPACE DB_STUDY_LOCAL_01 
DATAFILE 'C:/app/FengYeHong/product/21c/custom_table_space/local_db_study_01.dbf' SIZE 100M AUTOEXTEND ON;

-- 创建临时表空间并指定临时表空间文件
CREATE TEMPORARY TABLESPACE DB_STUDY_TMP_LOCAL_01 
TEMPFILE 'C:/app/FengYeHong/product/21c/custom_table_space/local_db_study_tmp_01.dbf' SIZE 100M AUTOEXTEND ON;

⏹查看创建的表空间

SQL> SELECT TABLESPACE_NAME, CONTENTS, STATUS FROM DBA_TABLESPACES;

TABLESPACE_NAME                CONTENTS              STATUS
------------------------------ --------------------- ---------
SYSTEM                         PERMANENT             ONLINE
SYSAUX                         PERMANENT             ONLINE
UNDOTBS1                       UNDO                  ONLINE
TEMP                           TEMPORARY             ONLINE
USERS                          PERMANENT             ONLINE
DB_STUDY_LOCAL_01              PERMANENT             ONLINE
DB_STUDY_TMP_LOCAL_01          TEMPORARY             ONLINE

7 rows selected.
SQL> set markup csv on
SQL>
SQL> select name,bytes,status from v$tempfile;

"NAME","BYTES","STATUS"
"C:\APP\FENGYEHONG\PRODUCT\21C\ORADATA\XE\XEPDB1\TEMP01.DBF",36700160,"ONLINE"
"C:\APP\FENGYEHONG\PRODUCT\21C\CUSTOM_TABLE_SPACE\LOCAL_DB_STUDY_TMP_01.DBF",104857600,"ONLINE"
SQL> set markup csv on
SQL>
SQL> SELECT FILE_NAME, TABLESPACE_NAME, BYTES, STATUS FROM DBA_DATA_FILES;

"FILE_NAME","TABLESPACE_NAME","BYTES","STATUS"
"C:\APP\FENGYEHONG\PRODUCT\21C\ORADATA\XE\XEPDB1\SYSTEM01.DBF","SYSTEM",293601280,"AVAILABLE"
"C:\APP\FENGYEHONG\PRODUCT\21C\ORADATA\XE\XEPDB1\SYSAUX01.DBF","SYSAUX",408944640,"AVAILABLE"
"C:\APP\FENGYEHONG\PRODUCT\21C\ORADATA\XE\XEPDB1\UNDOTBS01.DBF","UNDOTBS1",104857600,"AVAILABLE"
"C:\APP\FENGYEHONG\PRODUCT\21C\ORADATA\XE\XEPDB1\USERS01.DBF","USERS",5242880,"AVAILABLE"
"C:\APP\FENGYEHONG\PRODUCT\21C\CUSTOM_TABLE_SPACE\LOCAL_DB_STUDY_01.DBF","DB_STUDY_LOCAL_01",104857600,"AVAILABLE"

⏹如果要删除表空间的话,可以使用下面的命令。

DROP TABLESPACE DB_STUDY_01 INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE DB_STUDY_TMP_01 INCLUDING CONTENTS AND DATAFILES;

五. 为用户分配默认表空间并指定表空间配额

⏹将用户和表空间关联起来,为用户分配默认表空间和临时表空间。

ALTER USER db_user 
DEFAULT TABLESPACE DB_STUDY_LOCAL_01 
TEMPORARY TABLESPACE DB_STUDY_TMP_LOCAL_01;

⏹确认用户和表空间的关联

SQL> SELECT username, default_tablespace, temporary_tablespace FROM dba_users WHERE username = 'DB_USER';

USERNAME     DEFAULT_TABLESPACE             TEMPORARY_TABLESPACE
------------ ------------------------------ ------------------------------
DB_USER      DB_STUDY_LOCAL_01              DB_STUDY_TMP_LOCAL_01

SQL>

⏹用户有了默认表空间之后,并不意味着可以创建表并成功插入数据,还需要向用户分配表空间的配额,指定用户可以使用的存储配额。

-- 注意,需要在PDB的session中执行
SQL> ALTER SESSION SET CONTAINER = XEPDB1;

Session altered.

SQL>
-- 在未分配配额之前,查询不到任何数据
SQL> SELECT * FROM DBA_TS_QUOTAS WHERE USERNAME = UPPER('db_user');

no rows selected

SQL>
-- 指定 db_user 用户对 DB_STUDY_LOCAL_01 表空间有无限的配额,可以随意使用
SQL> ALTER USER db_user QUOTA UNLIMITED ON DB_STUDY_LOCAL_01;

User altered.

SQL>
-- 分配完成之后,进一步查看
SQL> SELECT * FROM DBA_TS_QUOTAS WHERE USERNAME = UPPER('db_user');

"TABLESPACE_NAME","USERNAME","BYTES","MAX_BYTES","BLOCKS","MAX_BLOCKS","DROPPED"
"DB_STUDY_LOCAL_01","DB_USER",0,-1,0,-1,"NO"

六. 通过创建的用户进行登录

⏹我们创建的是本地用户,因此通过sqlplus命令进行登录的时候,必须明确的指出使用的是名称为XEPDB1PDB

apluser@ubuntu24-01:~$ sqlplus db_user/oracle@192.168.118.137/XEPDB1

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Jan 1 10:11:43 2025
Version 21.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Tue Dec 31 2024 22:58:55 +09:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL> SHOW CON_NAME;

CON_NAME
------------------------------
XEPDB1
SQL>

⏹修改tnsnames.ora文件

apluser@ubuntu24-01:~$ cat $ORACLE_HOME/network/admin/tnsnames.ora
SERVICE_XE_CLIENT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.118.137)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

SERVICE_XEPDB1_CLIENT =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.118.137)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XEPDB1)
    )
  )
apluser@ubuntu24-01:~$
apluser@ubuntu24-01:~$ sqlplus db_user/oracle@SERVICE_XEPDB1_CLIENT

SQL*Plus: Release 21.0.0.0.0 - Production on Wed Jan 1 10:21:32 2025
Version 21.16.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Wed Jan 01 2025 10:11:44 +09:00

Connected to:
Oracle Database 21c Express Edition Release 21.0.0.0.0 - Production
Version 21.3.0.0.0

SQL>

七. 创建脚本,简化登录

apluser@ubuntu24-01:~$ which oralce_db_connect
/home/apluser/bin/oralce_db_connect
apluser@ubuntu24-01:~$
apluser@ubuntu24-01:~$ ls -l /home/apluser/bin/oralce_db_connect
-rwxrwxr-x 1 apluser apluser 912 Jan  1 08:43 /home/apluser/bin/oralce_db_connect
apluser@ubuntu24-01:~$
apluser@ubuntu24-01:~$ cat /home/apluser/bin/oralce_db_connect
#!/bin/bash
# ################################################
# 简介:
# 动态连接 Oracle 数据库
#
# 完整方式连接数据库
# sqlplus db_user/oracle@192.168.118.137/XEPDB1
#
# 用法
# 1. oralce_db_connect
# 2. oralce_db_connect dba
# # ################################################

# 默认参数
USERNAME="db_user"
PASSWORD="oracle"
SERVICE="SERVICE_XEPDB1_CLIENT"
MSG="通过普通用户登录..."

# 如果传入参数为 "dba",则使用 system 用户登录
if [ "$1" == "dba" ]; then
  USERNAME="system"
  PASSWORD="oracle"
  SERVICE="SERVICE_XE_CLIENT"
  MSG="通过dba用户登录..."
fi

# 构造连接oracle数据库的命令
connect_oracle_db_command="sqlplus ${USERNAME}/${PASSWORD}@${SERVICE}"

# 打印连接oracle数据库的命令
echo "${connect_oracle_db_command}"

# 打印提示消息
echo -e "\e[1;31m$MSG\e[0m"

# 连接oracle数据库
eval "${connect_oracle_db_command}"

八. 查看用户信息

8.1 无需DAB用户

USER_USERS 表

SQL> SELECT USERNAME, USER_ID, ACCOUNT_STATUS FROM USER_USERS;

"USERNAME","USER_ID","ACCOUNT_STATUS"
"DB_USER",110,"OPEN"

ALL_USERS

SQL> SELECT USER_ID, USERNAME, COMMON FROM ALL_USERS WHERE USERNAME = 'DB_USER';

"USER_ID","USERNAME","COMMON"
110,"DB_USER","NO"

8.2 需要DAB用户

💥注意💥
当使用system的DBA用户进行查看的时候,注意切换当前的session为 PDB(可插入数据库)而不是 CDB(容器数据库)。

-- XEPDB1 为 PDB 的容器名称
 ALTER SESSION SET CONTAINER = XEPDB1;

DBA_USERS

SQL> SELECT USER_ID, USERNAME, ACCOUNT_STATUS, COMMON, TO_CHAR(LAST_LOGIN, 'YYYY/MM/DD HH24:MI:SS') LAST_LOGIN FROM DBA_USERS WHERE USERNAME = 'DB_USER';

   USER_ID USERNAME          ACCOUNT_STATUS        COM LAST_LOGIN
---------- ----------------- --------------------- --- -------------------
       110 DB_USER           OPEN                  NO  2025/01/01 13:13:49

DBA_SYS_PRIVS

SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE = 'DB_USER';

GRANTEE PRIVILEGE                                ADM COM INH
------- ---------------------------------------- --- --- ---
DB_USER CREATE PROCEDURE                         NO  NO  NO
DB_USER CREATE SEQUENCE                          NO  NO  NO
DB_USER CREATE VIEW                              NO  NO  NO
DB_USER CREATE TABLE                             NO  NO  NO
DB_USER CREATE SESSION                           NO  NO  NO

九. 创建表,并插入数据

9.1 查看当前用户的schema

⏹一般来说,用户默认的schema和用户名相同,也可以通过下面这种方式进行查看。

SQL> SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') AS DEFAULT_SCHEMA FROM DUAL;

"DEFAULT_SCHEMA"
"DB_USER"

9.2 插入数据

⏹在创建表的时候,指定表空间,如果不指定的话,将会使用当前用户默认的表空间。

CREATE TABLE DB_USER.PERSON_TABLE (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(50),
    age NUMBER,
    email VARCHAR2(100),
    created_date DATE
) TABLESPACE DB_STUDY_LOCAL_01;

⏹写一个脚本,自动向表中插入100条数据

BEGIN
    FOR i IN 1..100 LOOP
        INSERT INTO DB_USER.PERSON_TABLE (id, name, age, email, created_date)
        VALUES (
            i,
            'Name_' || i,
            TRUNC(DBMS_RANDOM.VALUE(18, 60)), -- 随机年龄
            'user' || i || '@example.com',
            SYSDATE - DBMS_RANDOM.VALUE(0, 365) -- 随机日期
        );
    END LOOP;
    COMMIT;
END;
/

9.3 查看

⏹本地用户查看表名所在的表空间 👉 USER_TABLES

SQL> SELECT TABLE_NAME, TABLESPACE_NAME FROM USER_TABLES WHERE TABLE_NAME = 'PERSON_TABLE';

"TABLE_NAME","TABLESPACE_NAME"
"PERSON_TABLE","DB_STUDY_LOCAL_01"

⏹DBA用户查看表名所在的表空间 👉 DBA_TABLES

SQL> SELECT TABLE_NAME, OWNER, TABLESPACE_NAME FROM DBA_TABLES WHERE TABLE_NAME = 'PERSON_TABLE';

"TABLE_NAME","OWNER","TABLESPACE_NAME"
"PERSON_TABLE","DB_USER","DB_STUDY_LOCAL_01"

⏹可以看到,数据插入成功后可以被查询到。

总结 

到此这篇关于Oracle数据库创建本地用户、授予权限、创建表并插入数据的文章就介绍到这了,更多相关Oracle创建本地用户、授予权限内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文