1. 程式人生 > >oracle12c 建立資料庫和表(一)

oracle12c 建立資料庫和表(一)

**

1.基本概念

**
折騰了幾天終於有點眉頭了。oracle、plsql安裝包去官網下載,安裝教程百度即可。先了解一下Oracle12新特性吧。Oracle12c 中,增加了可插接資料庫的概念,即PDB,允許一個數據庫容器(CDB)承載多個可插拔資料庫(PDB)。CDB全稱為 ContainerDatabase,中文翻譯為資料庫容器,PDB全稱為PluggableDatabase,即可插拔資料庫。在ORACLE 12C之前,例項與資料庫是一對一或多對一關係(RAC):即一個例項只能與一個數據庫相關聯,資料庫可以被多個例項所載入。而例項與資料庫不可能是一對 多的關係。當進入ORACLE 12C後,例項與資料庫可以是一對多的關係。下面是官方文件關於CDB與PDB的關係圖。(經典關係圖鎮貼~)
CDB與PDB的關係圖

2. 建立資料庫步驟

首先用sys登陸,然後按照以下步驟操作。

  --1.建立CDB資料表空間(data)
  CREATE TABLESPACE Cdb1_Test_data
  LOGGING 
  DATAFILE 'D:\DataBase\DataFile\CDB1\CDB_Test_data01.dbf'
  SIZE 32m
  AUTOEXTEND ON
  NEXT 32m MAXSIZE 2048m
  EXTENT MANAGEMENT LOCAL ; 
  
 --2.建立CDB臨時表空間TABLESPACE
  CREATE TEMPORARY TABLESPACE Cdb1_Test_temp
  TEMPFILE 'D:\DataBase\DataFile\CDB1\CDB_Test_temp01.dbf'  --建立路徑
  SIZE 32m --初始大小32M
  AUTOEXTEND ON 
  NEXT 32m MAXSIZE 2048m    --最大2048m
  EXTENT MANAGEMENT LOCAL ;
  

補充:ORACLE資料庫登陸預設所有使用者連線到的是CDB,所以這裡建立的是CDB中的表空間和臨時表空間。

 --3.建立CDB使用者並指定表空間
  CREATE USER C##Cdb1_TestUser1 IDENTIFIED BY Cdb1_TestUser1
  DEFAULT TABLESPACE Cdb1_Test_data
  TEMPORARY TABLESPACE Cdb1_Test_temp;
  
 --4.給CDB使用者授權、連線許可權、dba許可權
  GRANT CONNECT ,RESOURCE ,DBA TO C##Cdb1_TestUser1;
  --給使用者賦所有的pdb會話許可權,即登陸所有pdb的許可權
  grant create session to C##Cdb1_TestUser1 container=all ;

補充:給CDB使用者分配表空間,並賦權,因為預設連線的是CDB所以操作的也都是CDB容器的操作,在這裡建立的使用者也是CDB使用者。建立CDB使用者時必須以C##或c##開頭:如c##a、c##b或C##c;(後邊a、b、c就是你起的名字,登陸cdb時使用者名稱也必須以c##開頭),如果要操作PDB容器需要手動切換,下邊會講到。
–DBA: 擁有全部特權,是系統最高許可權,只有DBA才可以建立資料庫結構
–RESOURCE:擁有Resource許可權的使用者只可以建立實體,不可以建立資料庫結構。
–CONNECT:擁有Connect許可權的使用者只可以登入Oracle,不可以建立實體,不可以建立資料庫結構。
–對於普通使用者:授予connect, resource許可權。
–對於DBA管理使用者:授予connect,resource, dba許可權。
以上CDB容器操作已經完成,接下來就是操作PDB容器了。到現在你應該理解了什麼是PDB了吧?PDB就是資料庫~,而CDB就是這些資料庫的容器

--5.檢視當前CDB容器中包含的PDB容器
select con_id,dbid,NAME,OPEN_MODE from v$pdbs;

補充:在Oracle 12C中,賬號分為兩種,一種是公用賬號,一種是本地賬號(亦可理解為私有賬號)。共有賬號是指在CDB下建立,並在全部PDB中生效的賬號,另一種是在PDB中建立的賬號。在cdb中只能建立全域性使用者(c##開頭),會在cdb和所有的pdb中建立該使用者(但是pdb中的全域性使用者需要另外授權才能夠在pdb中訪問)。在pdb中只能建立的使用者為本地使用者。如果想要創本地使用者,需要切換到PDB容器,首先檢視當前CDB容器中包含的有哪些PDB容器,(接下來的操作其實就是建立PDB使用者、表空間、臨時表空間)
CDB 中的defaulttablespace 和 default temporary tablespace 只能在CDB中操作。PDB 可以有自己的temporary表空間(臨時表空間),也可以不用,在建立PDB的時候如果沒有指定temporary表空間,那麼就會共用CDB的temporary 表空間。
檢視當前CDB容器中包含的PDB容器
補充:注意這裡的PDB,在CDB 啟動之後,PDB 預設是mount狀態,而不是OPEN。 所以我們還需要手動去open它,當然,也可以通過在CDB中配置觸發器來自動open,後邊補充。(cdb啟動之後,資料庫預設是關閉狀態,需要手動開啟資料庫。'PDBSEED,PDBSeedCDBPDBSEED',這個是你建立PDB資料庫的模板,你不能在Seed中新增或修改一個物件。每個CDB中有且只能有一個PDBSEED,後邊補充)
補充:如果忘記自己切換的是哪個容器了可以執行如下語句

--檢視當前使用容器
select sys_context ('USERENV', 'CON_NAME') from dual;

--6.切換為PDB容器(這句命令也可以切回CDB容器,‘PDBORCL’是我的pdb名稱,
--如果切回CDB容器‘PDBORCL’請改成'CDB$ROOT')
alter session set container = PDBORCL;

--7.開啟PDB(開啟可插入資料庫開啟/關閉:open/close)
--PDBORCL 是我的PDB容器
alter pluggable database PDBORCL open;

接下來的操作就和在oracle11中的操作差不多了,這裡只需要注意的是建立使用者名稱的時候不需要C##了

  --8.建立PDB資料表空間(data)
  CREATE TABLESPACE PdbOrcl_data
  LOGGING 
  DATAFILE 'D:\DataBase\DataFile\CDB1\PDB_ORCL\PdbOrcl_data01.dbf'
  SIZE 32m
  AUTOEXTEND ON
  NEXT 32m MAXSIZE 2048m
  EXTENT MANAGEMENT LOCAL ; 

  --9.建立PDB臨時表空間TABLESPACE
  CREATE TEMPORARY TABLESPACE PdbOrcl_temp
  TEMPFILE 'D:\DataBase\DataFile\CDB1\PDB_ORCL\PdbOrcl_temp01.dbf'  --建立路徑
  SIZE 32m --初始大小32M
  AUTOEXTEND ON 
  NEXT 32m MAXSIZE 2048m    --最大2048m
  EXTENT MANAGEMENT LOCAL ;
  
  --10.建立使用者並指定表空間
  CREATE USER PdbOrcl_TestUser1  IDENTIFIED BY PdbOrcl_TestUser1 
  DEFAULT TABLESPACE PdbOrcl_data
  TEMPORARY TABLESPACE PdbOrcl_temp;
  
  --11.給使用者授權、連線許可權、dba許可權
  GRANT CONNECT ,RESOURCE ,DBA TO PdbOrcl_TestUser1;

至此資料庫建立完成。應該可以萬事大吉了?然後用賬號登入資料庫,PDB賬號登入就直接彈框~
經過查詢是因為沒有配置tns檔案,把下邊的配置放入你D:\app\Darker2\product\12.1.0\dbhome_1\NETWORK\ADMIN這個資料夾下的tnsnames.ora檔案末尾中;我安裝的時候沒有修改這個路徑,所以我這個是預設路徑。你只需找到你安裝時候的這個資料夾修改tnsnames.ora檔案;

PDBORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = PDBORCL)
    )
  )

這裡改成了我的SERVICE_NAME :PDBORCL,你改成你的資料庫名字就可以了,其他配置基本不變,詳細解釋如下。
補充:PDBORCL:是例項名稱,你起什麼名字登陸的時候就會顯示什麼例項名稱。
ADDRESS :伺服器連線配置。
PROTOCOL:指明要連線使用的協議。(TCP/IP)。
HOST:是TCP/IP協議使用的伺服器IP地址。(localhost是指本地ip,你也可以直接填寫本地ip進去,檢視本地ip在cmd視窗中輸入ipconfig,裡邊的Ipv4就是你本地ip)。
PORT:是TCP/IP使用的埠號。(預設使用的是1521)。
SERVER=DEDICATED:表示用專用伺服器連線ORACLE資料庫。
SERVICE_NAME:這個意思就很明顯了,就是服務名稱。這裡填寫你新建的資料庫名稱(PDBORCL資料庫)。
然後再次登入的時候就會出現你剛配置的例項了,輸入剛建立的PDB賬號和密碼就能成功登入了。
配置tnsnames.ora
現在才真正的完成了資料庫建立。接下來就可以建立表了。

--建表
CREATE TABLE test_table ( id  NUMBER  (12)  PRIMARY KEY ,
  user_name VARCHAR2  (32)    not null,
  user_age  NUMBER  (3),
  user_sex  NUMBER  (2)   not null,
  user_phone  NUMBER  (11)    not null,
  user_remarks  VARCHAR2  (64),
  status  NUMBER  (1) ,
  createUser  VARCHAR2  (64) ,
  createDate  DATE,
  updateUser  VARCHAR2  (64),
  updateDate  DATE);
  
--添加註釋
comment on table  test_table is '測試表';
comment on column  test_table.id is '主鍵id';
comment on column  test_table.user_name is '姓名';
comment on column  test_table.user_age is '年齡';
comment on column  test_table.user_sex is '性別:01男/02女';
comment on column  test_table.user_phone is '電話';
comment on column  test_table.user_remarks is '備註';
comment on column  test_table.status is '使用者狀態:0未啟用/1啟用';
comment on column  test_table.createUser is '建立使用者';
comment on column  test_table.createDate is '建立時間';
comment on column  test_table.updateUser is '修改使用者';
comment on column  test_table.updateDate is '修改時間';

--建立序列
create sequence seq_test_table_id
start with 1	--序列起始
minvalue 1	--序列最小值
increment by 1	--自增長度(每次自增加幾)
nocache;	--不快取(不設定預設快取20)

--建立觸發器
create or replace trigger trg_test_table_id
before insert
on test_table
for each row when (new.id is null)
begin
select seq_test_table_id.nextval into:new.id from dual;
end;

整個過程建立完畢,歡迎各路大神指點糾正,純屬個人見解,望大神輕噴~
有什麼問題大家可以在下方留言,希望共同進步~
上傳一下我寫的資料字典,建表很好用的大家一看就知道啦~