1. 程式人生 > 其它 >29_506. 相對名次

29_506. 相對名次

前言

本貼內容紀錄Oracle課程中的學習筆記,和Oracle的課後作業,以及資料庫相關課程的學習筆記,筆記部分使用例項程式碼記錄,不記詳細語法。

使用者管理

1.如果新安裝資料庫後,忘了oracle使用者的密碼,可以用哪些方法重新設定密碼?(從系統使用者sys和普通使用者scoot兩個方面去考慮),針對兩種不同型別的使用者,給出解決問題的具體思路和程式碼。

分兩種情況考慮:

一種是忘記普通使用者(如scoot)

用SYS (或SYSTEM)使用者登入: CONN SYS/PASS_WORD AS SYSDBA; 使用修改語句:ALTER USER user_name IDENTIFIED BY newpass;

注意:密碼不能純數字或以數字開頭,否則會出現ORA-00988: 口令缺失或無效

另一種是管理員使用者(SYS或System)

可以使用ORAPWD.EXE 工具修改密碼。

開始選單->執行->輸入CMD,開啟命令提示符視窗,輸入如下命令:

orapwd file=D:oracleproduct10.2.0db_1databasepwdctcsys.ora password=Wut1234

或者使用系統模式登陸 cmd中輸入 sqlplus /nolog 使用系統登入 conn / as sysdba; 輸入 alter user sys identified by Wut1234;


使用者以及許可權管理

建立使用者

CREATE USER user1 IDENTIFIED BY user1;

授權 WITH ADMIN OPTION 傳遞

GRANT CREATE SESSION,CREATE TABLE TO user1 WITH ADMIN OPTION;

收回授權

REVOKE CREATE SESSION,CREATE TABLE FROM user1;

將scott模式下的emp表的SELECT,UPDATE,INSERT許可權授予user1使用者(帶 WITH GRANT OPTION 引數)。

CONN scott/tiger
GRANT SELECT,INSERT,DELETE ON emp TO user1 WITH GRANT OPTION;

回收使用者user1授予的scott模式下的emp表的SELECT,UPDATE,INSERT許可權。

CONN scott/tiger@orcl
REVOKE SELECT,UPDATE,INSERT ON emp FROM user1;

表空間

建表空間

CREATE TABLESPACE datastudent
  DATAFILE '%ORACLE_HOME%databasedatastudent.dbf'
    SIZE 100M REUSE
  UNIFORM SIZE 128K;

建臨時表空間

CREATE TEMPORARY TABLESPACE tempstudent
  TEMPFILE '%ORACLE_HOME%databasetempstudent.dbf' 
  SIZE 120M REUSE
  UNIFORM SIZE 128K;

建使用者並指定表空間

CREATE USER class_mgr IDENTIFIED BY manager DEFAULT TABLESPACE datastudent TEMPORARY TABLESPACE tempstudent;

授權使用者指定許可權

GRANT SELECT ON scott.emp TO class_mgr;
GRANT UPDATE(deptno,dname) ON scott.dept to class_mgr;

手動修改表空間大小

ALTER TABLESPACE data_ts1 
ADD DATAFILE
'%ORACLE_HOME%databasedata_ts2.dbf' SIZE|RESIZE 10M; //增加/減少

開啟/關閉自動擴容

ALTER DATABASE DATAFILE        
'%ORACLE_HOME%databasedata_ts2.dbf' 
AUTOEXTEND ON|OFF NEXT 5M MAXSIZE 100M;  //開關

刪除表空間-刪除臨時

ALTER TABLESPACE temp_ts1 
DROP TEMPFILE 
'%ORACLE_HOME%databasetemp_ts2.dbf';

刪除表空間-刪除資料檔案及約束

DROP TABLESPACE temp_ts1 
  INCLUDING CONTENTS AND DATAFILES
  CASCADE CONSTRAINTS;

表空間離線/上線

ALTER TABLESPACE tablespace_name ONLINE|OFFLINE

離線狀態的表空間是不能進行資料訪問的,所對應的所有資料檔案也都處於離線狀態。

表空間讀寫狀態

ALTER TABLESPACE tbs_name   
READ ONLY|READ WRITE  //可讀 讀寫

Oracle資料型別

常用資料型別:

  • VARCHAR2:可變長字串型別,≤4KB
  • DATE :固定長度(7B)的日期型。注意儲存與使用格式
  • TIMESTAMP:時間戳型別,可更精確的儲存與表示時間
  • NUMBER:數字型,可存放實型和整型
  • FLOAT:浮點型,可存放實型

不常用資料型別:

  • BLOB 大二進位制物件型別,≤4GB
  • CLOB 大字串物件型別,≤4GB
  • NCLOB:多位元組字符集的CLOB,≤4GB
  • BFILE:外部二進位制檔案型別,只讀,大小與OS有關
  • ROWID:儲存記錄行的實體地址(2進製表示),固定為10個位元組

特殊型別Date(注意)

用來存放日期時間型別資料,用7個位元組分別描述年、月、日、時、分、秒。 語法格式:

date_field DATE;

預設格式為DD-MON-YY,分別對應日、月、年。

例17-JUN-02。(月份的表達要用英文單詞的縮寫格式)。

日期的格式可以設定為中文格式,例如17-六月-2002。

to_date('2017-03-02','yyyy-mm-dd')

SQL> select to_date('2017-03-02','yyyy-mm-dd') from dual;

Oracle衍生Date型別-TIMESTAMP 不展開贅述

表管理

表是真正儲存各種各樣資料的物件,由行和列組成。行有時也稱為記錄,列有時也稱為欄位或域。設計資料庫時,要決定它包括哪些表,每個表中包含哪些列,每列的資料型別等。

在表中建立列時,必須為其指定資料型別,列的資料型別決定了資料的取值、範圍和儲存格式。

建表

Create Table XS
(XH VARCHAR2 (10) NOT NULL,
 XM VARCHAR2 (20) NOT NULL,
 ZYM VARCHAR2 (20),
 XB VARCHAR2(2) NOT NULL,
 CSSJ Date NOT NULL,
 ZXF Number(2) DEFAULT 01,
 BZ Varchar(200)
);

使用查詢建表

為了儲存原始資料以便於恢復或是得到一個與源表一樣結構的表,可通過子查詢建立表。

CREATE TABLE XS_JSJ
  AS SELECT * FROM XS WHERE ZYM='計算機' ;

例為計算機專業的學生建立一個備份表XS_JSJ。

表管理

主要為對列及其屬性的修改

增加列

ALTER TABLE XS  ADD
( JXJ NUMBER(1),
DJSM VARCHAR2(40) DEFAULT '獎金1000元'
);

修改列

ALTER TABLE XS
	MODIFY ( DJSM DEFAULT '獎金800元' );

刪除列

ALTER TABLE XS
 DROP COLUMN DJSM;

修改表名

Alter Table XS   Rename To XSCopy;

Alter Table XS 
RENAME XS TO XSCopy;

修改欄位名

Alter Table xscopy
Rename Column BZ To BZSM;

刪除表

DROP TABLE XS;

表的刪除閃回

FLASHBACK TABLE XS TO BEFORE DROP;

注意:管理員sys是沒有回收站,請儘量不要在sys使用者下建立表

語法:FLASHBACK TABLE 表名TO BEFORE DROP;

此命令可用於恢復誤刪除的表、檢視和索引。

徹底刪除表

無法閃回

DROP TABLE XS PURGE;

臨時表

臨時表的特點:

  • 多使用者操作的獨立性:對於使用同一張臨時表的不同使用者,ORACLE都會分配一個獨立的臨時表,這樣就避免了多個使用者在對同一張臨時表操作時發生交叉,從而保證了多個使用者操作的併發性和獨立性;
  • 資料的臨時性:既然是臨時表,顧名思義,存放在該表中的資料是臨時性的。ORACLE根據你建立臨時表時指定的引數(On Commit Delete Rows / On Commit Preserve Rows),自動將資料TRUNCATE掉。

會話級臨時表

會話級的臨時表因為這這個臨時表中的資料和你的當前會話有關係,當你當前SESSION不退出的情況下,臨時表中的資料就還存在,而當你退出當前SESSION的時候,臨時表中的資料就全部沒有了,當然這個時候你如果以另外一個SESSION登陸的時候是看不到另外一個SESSION中插入到臨時表中的資料的。即兩個不同的SESSION所插入的資料是互不相干的。當某一個SESSION退出之後臨時表中的資料就被截斷(truncate table,即資料清空)了。會話級的臨時表建立方法:

Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Preserve Rows;

事務級臨時表

事務級臨時表是指該臨時表與事務相關,當進行事務提交或者事務回滾的時候,臨時表中的資料將自行被截斷,其他的內容和會話級的臨時表的一致(包括退出SESSION的時候,事務級的臨時表也會被自動截斷)。事務級臨時表的建立方法:

Create Global Temporary Table Table_Name
(Col1 Type1,Col2 Type2...) On Commit Delete Rows;

兩中型別臨時表的區別

會話級臨時表採用on commit preserve rows;而事務級則採用on commit delete rows;用法上,會話級別只有當會話結束臨時表中的資料才會被截斷,而且事務級臨時表則不管是commit、rollback或者是會話結束,臨時表中的資料都將被截斷

約束

主鍵約束,外來鍵約束,特殊約束等

手機號約束

ALTER TABLE EMPLOYEES
ADD ( CONSTRAINT "CH_PHONE_CHECK" CHECK (phonenumber between '000000000000' and '999999999999') ) ;

索引

在Oracle 中,索引是為了加速對錶中元組的檢索而建立的一種分散儲存結構; 索引是對錶而建立的,由除存放表的資料頁面以外的索引頁面組成,獨立於被索引的表。

注意:索引增加了查詢的速度,但是會降低插入,修改,刪除的速度,故縣插入資料,後建立索引。

  • 索引中儲存了記錄的關鍵字和ROWID
  • 索引在邏輯上和物理上都與相關表的資料無關
  • 索引需要單獨的儲存空間。否則使用表所在表空間
  • 建立或刪除一個索引不會影響基於資料表的資料庫應用或其他索引
  • 建立索引後一般會增加資料更新操作的執行時間

B-樹索引(B-tree index)

B*樹索引儲存結構類似書的索引結構,有分支和葉兩種型別的儲存資料塊(葉子塊資料是排序的,從左向右遞增; 在分支塊和根塊中放的是索引的範圍 ),分支塊相當於書的大目錄,葉塊相當於索引到的具體的書頁。

對於取值範圍很大的列應當建立B樹索引。

點陣圖索引

點陣圖索引儲存主要用來節省空間,減少ORACLE對資料塊的訪問,它採用點陣圖偏移方式來與表的行ID號對應。( 每一個BIT(值是1或0)對應著一個ROWID。是1表示著BIT對應的ROWID有值;)

對於取值範圍很小的列應當建立點陣圖索引。

條件

  1. 索引的表或簇必須在自己的模式中;
  2. 必須在要索引的表上具有INDEX許可權;
  3. 必須具有CREATE ANY INDEX許可權。

建立索引

CONN scott/tiger@orcl
CREATE INDEX kc_kcm_index
    ON kc(kcm DESC)
    TABLESPACE my_index;

預設情況下,索引中資料按升序(ASC)排列

檢視

檢視(view),也稱虛表, 不佔用物理空間,這個也是相對概念,因為檢視本身的定義語句還是要儲存在資料字典裡的。檢視只有邏輯定義。每次使用的時候, 只是重新執行SQL.

檢視是從一個或多個實際表中獲得的,這些表的資料存放在資料庫中。那些用於產生檢視的表叫做該檢視的基表。一個檢視也可以從另一個檢視中產生。

檢視的定義存在資料庫中,與此定義相關的資料並沒有再存一份於資料庫中。通過檢視看到的資料存放在基表中。

檢視看上去非常象資料庫的物理表,對它的操作同任何其它的表一樣。當通過檢視修改資料時,實際上是在改變基表中的資料;相反地,基表資料的改變也會自動反映在由基表產生的檢視中。由於邏輯上的原因,有些Oracle檢視可以修改對應的基表,有些則不能(僅僅能查詢)。

需要給予檢視許可權

-- 給予建立檢視許可權
conn system
GRANT create view TO McswAdmin;

建立檢視

create or replace view vw_Users_Buy
as 
select "Users_Id","Goods_Id","Tr_Num"
from Transaction_Log 
order by "Tr_Id";

PL/SQL程式塊

PL/SQL程式塊是PL/SQL程式的基本單元,按照指定的方式,進行定義的一段程式。

概念等內容參考 PL/Sql語句塊

示例:


--序列
create sequence Users_sequence
   increment by 1 
   start with 10000020 
   nomaxvalue
   nocycle
   nocache

--觸發器
CREATE TRIGGER Users_idadd
   BEFORE INSERT ON Users
   FOR EACH ROW
   WHEN(NEW."Users_Id" is null) --當輸入ID為空時啟動觸發器
BEGIN
    select Users_sequence.nextval into :new."Users_Id" from sys.dual;
END;
--建立good_check函式,檢查商品的對應遊戲物品ID
CREATE OR REPLACE FUNCTION good_check
(f_goodsid Goods."Goods_Id"%type
)
RETURN Goods."Goods_Game_id"%TYPE
AS
    v_g_rname Goods."Goods_Game_id"%TYPE;
BEGIN
   select "Goods_Game_id" into v_g_rname FROM Goods 
         where "Goods_Id"=f_goodsid;
   RETURN  v_g_rname ;
EXCEPTION 
   WHEN NO_DATA_FOUND THEN
       DBMS_OUTPUT.PUT_LINE('沒有找到對應遊戲物品!');
END good_check;

--呼叫good_check輸入Goods_Id和Goods_Game_id檢查商品的對應遊戲物品ID
select good_check('ces01') from dual;