oracle數據庫基本操作四——視圖、授權控制與事務處理


4. SQL視圖的定義與操縱

  例4-1: (建立視圖)  建立計算機系的學生的視圖STUDENT_CS。

create view student_cs as select sno,sname,ssex,sage,sdept,sclass from student where sdept = 'CS' with check option;

  例4-2: (建立視圖)  建立由學號和平均成績兩個字段的視圖STUDENT_GR。

create view student_gr as select sno,avg(score) as avgsc from score group by sno;

  例4-3: (視圖查詢)  利用視圖STUDENT_CS,求年齡大於19歲的學生的全部信息。

select * from student_cs where sage > 19;

  例4-4: (視圖查詢)  利用視圖STUDENT_GR,求平均成績為88分以上的學生的學號和平均成績。

select * from student_gr where avgsc > 88;

  例4-5: (視圖更新)  利用視圖STUDENT_CS,增加學生( ‘96006’,‘張然’,‘CS’,‘02’,‘男’,19 )。

insert into student_cs(sno,sname,sdept,sclass,ssex,sage) values('96006','張然','CS','02','',19);

  例4-6: (視圖更新)  利用視圖STUDENT_CS,將學生年齡增加1歲。觀察其運行結果並分析原因。 

update student_cs set sage = sage + 1;

  例4-7: (視圖更新)  利用視圖STUDENT_GR,將平均成績增加2分。觀察其運行結果並分析原因。

update student_gr set avgsc = avgsc + 2;
//ORA-01732: 此視圖的數據操縱操作非法

  出現錯誤原因,在創建視圖時,沒有在末尾加上with check option ;

  例4-8: (視圖更新)  刪除視圖STUDENT_CS中學號為 ‘96006’ 的學生的全部數據。

delete from student_cs where sno = '96006';

  例4-9: (視圖更新)  刪除視圖STUDENT_GR的全部數據。

drop view student_gr;

//正確答案應該是 delete from student_gr;

  用delect 刪除不了student_gr,  原因:在創建視圖時,沒有在末尾加上with check option ;

  例4-10:(刪除視圖)  刪除視圖STUDENT_CS和STUDENT_GR。

 drop view student_cs;
 //drop view student_gr;

5. SQL數據控制語句:

  例5-1: (授權)  給左右鄰近同學(用戶)授予在表Student上的SELECT權限,並使這兩個用戶具有給其他用戶授予相同權限的權限。

grant select on student to sno_74276,sno_74278 with grant option;

  若沒有用戶需創建用戶,方法為:

  •  創建用戶:create user 用戶名 identified by 密碼;
  •  解鎖:alter user 用戶名 account unlock; 
  •  賦權:grant sysdba to 用戶名;  

  例5-2: (授權)  給鄰近同學(用戶)授予Teach表上的所有權限。

grant all on teach to sno_74276 with grant option;

  例5-3: (授權)  給所有用戶授予Score表上的SELECT權限。

 grant select on score to public ;

  例5-4: (授權驗證)  觀察左右鄰近同學查詢你所授權的表中的內容。

conn sno_74276/s123
select * from sunc.student;//可以查詢
select * from sunc.course;//不允許查詢未賦權表或者視圖
delete from sunc.student where sname = '**晨';//權限不足
select * from sunc.score;//可以訪問
......

  例5-5: (收回授權)  收回上面例子中的所有授予的權限。

revoke select on student from sno_74276,sno_74278;
revoke all on teach from sno_74276;
revoke select on score from public;

6. SQL事務處理:

  例6-1: (事務回退)  將課程名稱表中的 ‘程序設計’ 課程學時數修改為80、‘微機原理’ 課程學時數修改為70學時,查詢全部課程的總學時數后,取消所有修改(ROLLBACK)。再次查詢全部課程的總學時數。注意比較分析兩次查詢的結果。

update course set ctime = 80 where cname = '程序設計';
update course set ctime = 70 where cname = '微機原理';
rollback;

  update 修改ctime之后,數據確實被修改了,但是並沒有用commit進行提交,所以在使用rollback事務回退時,會返回原來的數據;

  例6-2: (事務提交)  將課程名稱表中的 ‘程序設計’ 課程學時數修改為80、‘微機原理’ 課程學時數修改為70學時,查詢全部課程的總學時數后,確認所有修改(COMMIT)。再次查詢全部課程的總學時數。注意比較分析兩次查詢的結果。

update course set ctime = 80 where cname = '程序設計';
update course set ctime = 70 where cname = '微機原理';
commit;//事務提交
rollback;//事務回退

在進行事務提交之后修改后的數據被保存下來,在使用事務回退,並不會返回最初始的值;

本次操作中出現的錯誤及解決方法:

1、ORA-01045: user SNO_74276 lacks CREATE SESSION privilege; logon denied

分析:創建User時沒有給賦上create session權限

解決方法:grant create session,resource to sno_74276;

2、SP2-0640: 未連接

解決方法:用sysdba 登錄  如 conn sys as sysdba/s123;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM