Oracle圖書借閱系統資料庫設計
一、實驗目的
通過該實驗把資料庫的理論知識(資料庫和資料表的設計理論、檢視、索引、儲存過程、觸發器、資料庫備份、資料庫安全等)應用到具體的綜合例項中,達到資料庫知識整合的目的。完成學生成績管圖書借閱理系統基本功能設計,提高學生的分析問題、解決問題的能力。
二、裝置與環境
硬體:多媒體計算機
軟體:WindowsXP以上的作業系統、Oracle 10g 資料庫管理系統
三、實驗內容及實驗結果
1.資料庫設計
設計思想
建立一個表空間LIBTBS,用於儲存圖書管理系統的各種表,首先需要定義資料檔案的儲存地址,並且定義該資料檔案的大小為500M、的分配方式為自動擴充套件、表空間的管理方式為本地管理。
然後,將該表空間對應的資料檔案的擴充套件方式定義為自動擴充套件,當該資料檔案被寫滿時,每一次擴充套件50M,最大的資料檔案大小為1000M,防止資料檔案被填滿而無法擴充套件。
具體實現
2.資料表設計
設計思想
建立四個表,定義在"SCOTT"模式下,儲存在之前建立的表空間LIBTBS中。這四個表是讀者表、圖書表、借閱表和歷史借閱表。
讀者表的作用是存放讀者資訊,讀者號,讀者姓名,性別,年級,學院,等等讀者相關的資訊。
圖書表的作用是存放圖書資訊,ISBN
借閱表的作用是對讀者表和圖書表的一個連結,顯示哪些人借的哪些書。借閱的日期和借閱過程產生的序列號資訊。
借閱歷史表的作用是記錄讀者的借書和換書的過程,時間,書名,讀者號碼等等資訊。對以前的借閱記錄有跡可尋。
具體實現
建立讀者表:
CREATE TABLE "SCOTT"."READER"
(
"LNO" CHAR(12) PRIMARY KEY,
"RNAME" VARCHAR2(10) NOT NULL,
"SEX" CHAR(2),
"BIRTHDAY"
"DEPT" VARCHAR2(20),
"SPEC" VARCHAR2(20),
"GRADE" CHAR(4),
"BORNUM" NUMBER(10) DEFAULT 0
)
TABLESPACE "LIBTBS";
ALTER TABLE "SCOTT"."READER" ADD CONSTRAINTS "Sex_CK1" CHECK(Sex BETWEEN '男' AND '女');
ALTER TABLE "SCOTT"."READER" ADD CONSTRAINTS "Bornum_CK2" CHECK(Bornum <= 10);
建立圖書表:
CREATE TABLE "SCOTT"."BOOK"
(
"ISBN" CHAR(12) PRIMARY KEY,
"BNAME" VARCHAR2(30) NOT NULL,
"AUTHOR" VARCHAR2(10),
"PRESS" VARCHAR2(40),
"PRICE" NUMBER(7) DEFAULT 0 NOT NULL,
"CD" CHAR(2) NOT NULL,
"COPYNUM" NUMBER(10),
"INVNUM" NUMBER(20),
"CLASS" VARCHAR2(20) NOT NULL,
CONSTRAINT "CD_CK1" CHECK(CD BETWEEN '有' AND '無')
)
TABLESPACE "LIBTBS";
建立借閱表:
CREATE TABLE "SCOTT"."LEND"
(
"LNO" CHAR(12) REFERENCES "SCOTT"."READER"(LNO),
"ISBN" CHAR(12) REFERENCES "SCOTT"."BOOK"(ISBN),
"BarNo" CHAR(10) PRIMARY KEY,
"Bordate" DATE DEFAULT SYSDATE NOT NULL
)
TABLESPACE "LIBTBS";
建立歷史借閱表:
CREATE TABLE "SCOTT"."HistoryLend"
(
"LNO" CHAR(12) REFERENCES "SCOTT"."READER"(LNO),
"ISBN" CHAR(12) REFERENCES "SCOTT"."BOOK"(ISBN),
"BarNum" CHAR(10) REFERENCES "SCOTT"."LEND"("BarNo"),
"Bordate" DATE NOT NULL,
"Retdate" DATE DEFAULT SYSDATE NOT NULL
)
TABLESPACE "LIBTBS";
ALTER TABLE "SCOTT"."HistoryLend" ADD PRIMARY KEY(LNO,ISBN,"BarNum");
3.檢視設計
設計思想
檢視可以作為一個特定查詢,使使用者可以重複使用,在本次綜合實驗中,我建立了一個查詢圖書、讀者資訊和借閱資訊的檢視,這樣不同的操作員就可以直接使用不同的檢視來查詢,而不是每個人都要輸入複雜的select語句;
同時,基於安全考慮,可以針對特定的檢視賦給使用者許可權,而不是給使用者賦給一個或幾個表的許可權,這樣可以避免誤操作更新資料的不安全因素。
具體實現
建立讀者的圖書資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Reader_C1"
AS
SELECT "ISBN","BNAME","AUTHOR","PRESS","INVNUM" FROM "SCOTT"."BOOK"
WITH READ ONLY;
建立讀者的借閱資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Reader_C2"
AS
SELECT "LNO","ISBN","BarNo" FROM "SCOTT"."LEND"
WITH READ ONLY;
建立圖書管理員的借閱資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Manager_C1"
AS
SELECT * FROM "SCOTT"."LEND"
WITH CHECK OPTION;
建立圖書管理員的歷史借閱資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Manager_C2"
AS
SELECT * FROM "SCOTT"."HistoryLend"
WITH CHECK OPTION;
建立圖書管理員的圖書資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Manager_C3"
AS
SELECT * FROM "SCOTT"."BOOK"
WITH CHECK OPTION;
建立圖書管理員的讀者資訊查詢檢視:
CREATE FORCE VIEW "SCOTT"."V_Manager_C4"
AS
SELECT "LNO","RNAME","SEX","DEPT","SPEC","GRADE","BORNUM" FROM "SCOTT"."READER"
WITH READ ONLY;
4.索引設計
設計思想
建立一些索引可以用來加速對資料的檢索。其實類似於圖書前面的目錄,你在一本書中找內容時會很耽誤時間,所以一般會先看目錄,找到感興趣的條目,而那個條目上是指明內容在那一頁的(內容所在的地址),然後就可以迅速找到需要的內容了。
具體實現
- 在圖書表的書名、出版社、作者、價格列是分別建立非唯一索引。
CREATE INDEX index_1
ON "SCOTT"."BOOK"("BNAME","PRESS","AUTHOR","PRICE");
- 在讀者表的讀者姓名、所在系部、就讀專業列是分別建立非唯一索引。
CREATE INDEX index_2
ON "SCOTT"."READER"("RNAME","DEPT","SPEC");
- 在讀者表的借閱數量列上建立一個反鍵索引。
CREATE INDEX index_3
ON "SCOTT"."READER"("BORNUM") REVERSE;
(4)在讀者表的性別列上建立一個位圖索引。
CREATE BITMAP INDEX index_4
ON "SCOTT"."READER"("SEX");
5.儲存過程和函式設計
設計思想
儲存過程的作用相當於單個表的操作方法,暫且只針對單個表的操作,例如呼叫儲存過程的時候傳一個Dept的引數,然後輸出滿足這個條件的學號和姓名,實現上面功能只調用這個儲存過程就行。
函式的建立與儲存過程的建立相似,不同之處在於,函式有一個顯示的返回值。所以函式裡面必須包含一個return語句,來指明函式的返回值,能限定函式返回值的型別,但是無法約束返回值的長度,精度,刻度等。最終也只有一個return背執行。
具體實現
建立查詢讀者資訊的儲存過程:
當呼叫該儲存過程是傳一個Dept的引數,然後就能輸出滿足這個條件的學號和姓名,這樣管理員就可以快速查詢到對應學生的資訊。
CREATE OR REPLACE PROCEDURE procedure_1(
p_Deptno "SCOTT"."READER"."DEPT"%TYPE)
AS
v_Lno "SCOTT"."READER"."LNO"%TYPE,
v_Rname "SCOTT"."READER"."RNAME"%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('The reader you found is:');
FOR v_Lno,v_Rname INTO ( SELECT "LNO","RNAME" INTO v_Lno,v_Rname
FROM "SCOTT"."READER"
WHERE "DEPT"=p_Deptno;)
LOOP
DBMS_OUTPUT.PUT_LINE(v_Lno||' '||v_Rname);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE('The reader you found is error!!');
END procedure_1;
建立查詢圖書資訊的儲存過程:
當呼叫該儲存過程是傳一個Class的引數,然後就能輸出滿足這個條件的Isbn號和書名,這樣圖書管理員就可以快速查詢到對應型別的圖書資訊。
CREATE OR REPLACE PROCEDURE procedure_2(
p_Class "SCOTT"."BOOK"."CLASS"%TYPE)
AS
v_Isbn "SCOTT"."BOOK"."ISBN"%TYPE,
v_Bname "SCOTT"."BOOK"."BNAME"%TYPE;
BEGIN
DBMS_OUTPUT.PUT_LINE('The book you found is:');
FOR v_Isbnv_Bname INTO ( SELECT "ISBN","BNAME" INTO v_Isbn,v_Bname
FROM "SCOTT"."BOOK"
WHERE "CLASS"=p_Class;)
LOOP
DBMS_OUTPUT.PUT_LINE(v_Isbn||' '||v_Bname);
END LOOP;
EXCEPTION
WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE('The book you found is error!!');
END procedure_2;
函式的建立:
建立根據學生的學號返回學生平均借書數量的函式:
呼叫函式並輸入學生的學號時,函式計算對應學生的平均借書數量並返回,這樣可以大大減少圖書管理員的工作量,方便管理員進行統計分析。
CREATE OR REPLACE FUNCTION scott.dept_fun
(v_lno scott.historylend.lno%TYPE,
V_rname OUT scott.reader.rname%TYPE)
Return number
Is
V_num NUMBER(4);
BEGIN
Select rname into v_rname from scott.historylend
Where lno = v_lno;
Select avg(bornum) into v_num from scott.lend join scott.historylend
On scott.lend.isbn = scott.historylend.isbn
Where scltt.reader.lno = v_lno;
Return v_number
End;
6.觸發器及包設計
設計思想
觸發器的作用很廣泛並且在資料庫裡面的作用也很關鍵,它的作用是主要實現某種功能(讀者借閱量的限制,讀者操作許可權等等),可以有效的阻攔一些操作並給予相關的提示!也可以用於某些數字的自增或者自減。
包的作用同儲存過程差不多,差別在於儲存過程只能在單個表中運用,而包卻可以在整個庫中呼叫,相當於其許可權是很大的!包相當於一個程式裡的函式,可以反覆呼叫、靈活性極強,對錶的操作也是比較方便與快捷的。
具體實現
建立一個觸發器,當圖書館的庫存量大於複本量時,提示錯誤,以防止圖書管理員的誤操作。
CREATE OR REPLACE TRIGGER trigger_book
BEFORE UPDATE ON "SCOTT"."BOOK"
FOR EACH ROW
WHEN("INVNUM">"COPYNUM")
BEGIN
RAISE_APPLICATION_ERROR(-20001,'The copynumber is lower than collectionnumber!!');
END trigger_book;
建立一個觸發器,當在借閱表中新增或刪除借閱資訊時,將讀者表中對應讀者的借書數量加1或者減1,以防止兩者無法對應。
CREATE OR REPLACE TRIGGER trigger_borrow
AFTER INSERT OR DELETE ON "SCOTT"."LEND"
DECLARE
v_lno "SCOTT"."LEND"."LNO"%TYPE;
BEGIN
IF INSERTING THEN
SELECT "LNO" INTO v_lno FROM "SCOTT"."READER" WHERE "LNO"=:NEW."LNO";
UPDATE "SCOTT"."READER" SET "BORNUM"="BORNUM"+1 WHERE "LNO"=:NEW."LNO";
ELSIF DELETING THEN
SELECT "LNO" INTO v_lno FROM "SCOTT"."READER" WHERE "LNO"=:NEW."LNO";
UPDATE "SCOTT"."READER" SET "BORNUM"="BORNUM"+1 WHERE "LNO"=:OLD."LNO";
END IF;
END trigger_borrow;
7.備份與恢復設計
設計思想
在對Oracle資料庫進行備份與恢復設計時,要考慮發生故障後,利用已備份的資料或控制檔案,重新建立一個完整的資料庫。恢復可以是例項恢復或者是介質恢復,例項恢復是在當oracle例項出現失敗後,oracle自動進行的恢復。而介質恢復則是在當存放資料庫的介質出現故障時進行恢復。
8.資料庫安全設計
設計思想
資料庫安全設計主要體現在為資料庫建立使用者,密碼,以及不同等級使用者的的許可權!這樣做就可以有效的讓不同使用者查閱的許可權都在管理員的管理下,防止資料的改動和丟失!因此要訪問資料庫,使用者必須指定有效的資料庫使用者賬戶,而且還要根據該使用者賬戶的要求成功通過驗證,每個資料庫使用者都有一個唯一的資料庫賬戶。Oracle建議這樣做是為了避免潛在的安全漏洞以及為特定的審計活動提供有意義的資料。
在本次綜合實驗中,我主要建立了Reader和Manager兩個角色,分別對應不同的許可權,將讀者使用者加到Reader角色中,將圖書管理員使用者加到Manager角色中,這樣就加強了對資料庫的保護。另外,建立概要檔案來描述如何使用系統的資源(主要是CPU資源)。將概要檔案賦予某個資料庫使用者,在使用者連線並訪問資料庫伺服器時,系統就按照概要檔案給他分配資源。
最後,新增審計功能,審計許可權的呼叫記錄、使用者的dml操作記錄、查詢操作記錄,對行為異常的使用者進行判斷並警告。另外,使用者都只能訪問檢視而不能直接訪問表,這也是資料庫安全設計的體現。
具體實現
建立學生使用者:
CREATE USER student1
IDENTIFIED BY 123
DEFAULT TABLESPACE USERS
QUOTA 5M ON USERS
PASSWORD EXPIRE;
CREATE USER student2
IDENTIFIED BY 123
DEFAULT TABLESPACE USERS
QUOTA 5M ON USERS
PASSWORD EXPIRE;
建立圖書管理員使用者:
CREATE USER manager1
IDENTIFIED BY 123
DEFAULT TABLESPACE USERS
QUOTA 5M ON USERS
PASSWORD EXPIRE;
建立角色:
CREATE ROLE student
NOT IDENTIFIED;
CREATE ROLE manager
NOT IDENTIFIED;
將角色賦予使用者:
GRANT CONNECT,student TO student1;
GRANT CONNECT,student TO student2;
GRANT CONNECT,manager TO manager1;
為角色賦予許可權:
GRANT SELECT ON "SCOTT"."V_Reader_C1" TO student;
GRANT SELECT ON "SCOTT"."V_Reader_C2" TO student;
GRANT CONNECT,RESOURCE,EXECUTE TO manager;
GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C1" TO manager;
GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C2" TO manager;
GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C3" TO manager;
GRANT SELECT,INSERT,DELETE,UPDATE ON "SCOTT"."V_Manager_C4" TO manager;
建立概要檔案:
開啟Oracle資料庫的審計功能:
四、實驗小結
通過本次綜合實驗,體會到了建立一個數據庫的艱辛,未來是個大資料時代,誰能將資料運用恰當,就能獲得巨大的成功,但是每個資料的出現都是在資料庫裡生存,這也間接表明了資料庫的重要性,無論對於個人還是對於國家,資料是非常重要的一部分,我們要好好利用資料。這個資料庫的實驗雖說沒有多大的難度,但想要做細做好卻需要很多的時間,希望以後我能將這個資料庫完善並且對應的寫一個java程式出來,這樣就是一個完整的圖書管理系統了,而不是隻有資料庫的一部分,這樣非常的不完善而且沒有什麼大的作用。通過課外的瞭解,每個軟體都是和資料庫掛鉤的,所以學好資料庫是必須的,希望在以後的學習中更加完善對資料庫的學習。
最後,要感謝老師對我的資料庫的指導,這次的實驗也發現自己的不少漏洞,以後還想往庫里加入一些遊標和觸發器的運用。使之變得更加地完善。