开发者

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

开发者 https://www.devze.com 2025-03-21 11:06 出处:网络 作者: fengyehongWorld
目录一. 用户的种类二. 切换session为PDB三. 创建用户并授予权限四. 创建表空间五. 为用户分配默fNFgCVUh认表空间并指定表空间配额六. 通过创建的用户进行登录七. 创建脚本,简化登录八. 查看用户信息8.1 无需DAB用户
目录
  • 一. 用户的种类
  • 二. 切换session为PDB
  • 三. 创建用户并授予权限
  • 四. 创建表空间
  • 五. 为用户分配默fNFgCVUh认表空间并指定表空间配额
  • 六. 通过创建的用户进行登录
  • 七. 创建脚本,简化登录
  • 八. 查看用户信息
    • 8.1 无需DAB用户
    • 8.2 需要DAB用户
  • 九. 创建表,并插入数据
    • 9.1 查看当前用户的schema
    • 9.2 插入数据
    • 9.3 查看
  • 总结 

    一. 用户的种类

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

    • 普通用户(Common User
      • 用户的名称必须以 C## 开头,在CDB中创建
      • 适用于管理员用户,用户管理CDB下的多个PDB
    • 本地用户(Local User
      • 用户的名称无需以 C## 开头,在PDB中创建
      • 更适合应用开发和租户管理
      • 我们平时开发时用的多是本地用户

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

    二. 切换session为PDB

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

    • 在包含 CDB(容器数据库)和 PDB(可插拔数据库)的环境中,显示会话所连接的容器的名称。
    • 容器可以是根容器(CDB$ROOT)、种子数据库(PDB$SEED)或某个具体的 PDB。
    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

    • SELECT PDB_ID, PDB_NAME, STATUS FROM DBA_PDBS;
    • SELECT NAME FROM V$PDBS;
    -- 方式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

    • ALTER SESSION SET CONTAINER = XEPDB1;
    • 我们只有在PDBsession中创建的才是PDB的用户,如果不切换session的话,创建的是CDB的用户。
    -- 切换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用户

    • COMMON = 'NO':滤出PDB的本地用户
    • COMMON = 'YES':滤出CDB的普通用户
    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   
    

    四. 创建表空间

    • 默认表空间:用户在不指定表空间的情况下创建的对象(如表)会存储到默认表空间。
    • 临时表空间:用户在执行排序操作(如 ORDER BY 或 GROUP BY)时会使用临时表空间。
    • SIZE 100M AUTOEXTEND ON:表空间大小为100M,当空间不足时,会自动增加
    -- 创建默认表空间并指定表空间文件
    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>
    

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

    • DBA_TS_QUOTAS 是 Oracle 数据库中的一个数据字典视图,主要用于显示用户在各个表空间上的配额(Quota)信息。
    • 记录用户在某个表空间中被分配的存储空间限制(配额)。
    • 可以查看配额是有限制的(如 1GB)还是无限制的(UNLIMITED)。
    • 表空间配额示例
      • ALTER USER db_user QUOTA 50M ON DB_STUDY_LOCAL_01;:指定用户有50M的配额。
      • ALTER USER db_user QUOTA UNLIMITED ON DB_STUDY_LOCAL_01;:指定用户有无限的配额。
    -- 注意,需要在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

    • 在 Oracle 的多租户架构中,你需要确保连接到正确的 PDB(可插入数据库)而不是 CDB(容器数据库)。
    • 在连接数据库时,服务名称决定了android连接的是哪个数据库实例。
    • CDB 是容器数据库,通常是你管理和创建多个 PDB 的地方。
    • 每个 PDB 是一个独立的数据库,可以有自己的用户、数据和表空间等。
    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 tphpo:
    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文件

    • 如果我们在多台服务器上有多个PDB的话,可以在sqlplus客户端安装的机器上,配置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>
    

    七. 创建脚本,简化登录

    • 每次登录oracle数据库,都要输入一长串的命令,很繁琐。可以创建一个脚本简化登录。
    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}"
    
    • 登录效果

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

    八. 查看用户信息

    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

    • 不需要DBA用户
    • 显示数据库中所有用户的基本信息,但比 DBA_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

    • 显示数据库中所有用户的详细信息,包括用户名、账户状态、默认表空间、密码有效期等。
    • 数据库管理员(DBA)管理用户时使用,查看所有用户的账户状态,如是否锁定、密码是否过期等。
    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 插入数据

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

    • TABLESPACE DB_STUDY_LOCAL_01:指定表空间
    • DB_USER.PERSON_TABLE:指定schema
    CREATE TABLE DB_USER.PERSON_TABLE (
        id NUMBER PRIMARY KEY,
        name phpVARCHAR2(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数据库创建本地用户、授予权限、创建表并插入数据的文章就介绍到这了,更多相关Oracle创建本地用户、授予权限内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号