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;