模式對象和用戶權限管理
一.實驗目標
1. 掌握Oracle常用對象的操作方法。會使用常用對象解決一些實際問題。
2. 掌握Oracle的安全管理方法。
二.實驗項目
1.索引,寫出相應SQL命令。
創建索引
(1) 創建student1表,併爲student1表建立主鍵。(“student1”的結構與“a_db.學生”表一樣)
create table student1
(學號 varchar2(4)not null,
姓名 varchar2(4 char) not null,
性別 varchar2(1 char) not null,
專業 varchar2(10 char not null,
註冊日期 date,
狀態 varchar2(8),
Primary key(學號));
(2) 爲student1表的“姓名”創建索引,索引名爲“obj1_1”。
create index obj1_1 on student1(姓名);
(3) 爲student1表的“註冊日期”創建索引,並以降序排列,索引名爲“obj1_2”。
create index obj1_2 on student1(註冊日期 desc);
(4) 爲student1表的“性別”創建位圖索引,索引名爲“student_gender_index”。
Create bitmap index student_gender_index on student1(性別);
(5) 爲student1表的“性別”與“姓名”創建組合索引,索引名爲“obj1_3”。
create index obj1_3 on student1(性別,姓名);
查看索引
利用數據字典視圖USER_INDEXES、USER_IND_COLUMNS查看索引信息。
select * from USER_INDEXES where table_name='student1';
select * from USER_IND_COLUMNS where table_name='student1';
刪除索引
刪除索引“student_ gender _index”。
drop index student_gender_index;
2.同義詞,寫出相應SQL命令。
創建同義詞
(1) 創建student1表的同義詞,名爲“obj1_4”。
Create synonym obj1_4 from student;
(2) 創建obj1_3的同義詞,名爲“obj1_5”。
Create synonym obj1_5 from obj1_3;
(3) 創建同義詞obj1_5的同義詞,名爲“st1”。
craete st1 for obj1_5
(4) 創建某Oracle對象的公共同義詞,公共同義詞的命名規則:字符串“obj1_”後面跟上你的學號。(Oracle對象任意,在自己的計算機上完成)
create public synonym obj1_201705961429 for scott.emp;
查看同義詞
利用數據字典視圖user_synonyms、all_synonyms查看同義詞信息。
select synonym_name,table_name,table_owner from user_synonyms;
刪除同義詞
刪除同義詞st1。
drop synonym st1;
3.序列,寫出相應SQL命令。
創建序列
(1) 創建序列,該序列起始值50,步長爲10,不緩衝,序列名爲“obj1_6”。
create sequence obj1_6 start with 50 increment by 10 nocache;
(2) 創建序列,該序列最大值無限制,最小值爲1,步長爲1,序列名爲“obj1_7”。
create sequence obj1_7 start with 1 nomaxvalue increment by 1;
(3) 創建序列,該序列起始值爲1000,步長爲2,最大值爲10000,不可循環,序列名爲“seq_1”。
create sequence seq_1 start with 1000 increment by 2 maxvalue 10000 nocycle;
查看序列
利用數據字典視圖user_SEQUENCES、all_SEQUENCES查看序列信息。
select * from all_SEQUENCES where sequence_owner='A201705961429';
select * from user_SEQUENCES;
引用序列
向DEPT表中插入三條記錄,利用序列obj1_6生成部門編號。
insert into dept values(obj1_6.nextval,null,null,null,null,null);
insert into dept values(obj1_6.nextval,null,null,null,null,null);
insert into dept values(obj1_6.nextval,null,null,null,null,null);
修改序列
(1) 修改序列“obj1_6”,將該序列最大值設爲“82000”,最小值設爲“10”,步長設爲“5”。
alter sequence obj1_6
maxvalue 82000
minvalue 10
increment by 5;
(2) 修改序列“obj1_7”,將該序列最大值設爲“1000”。
alter sequence obj1_7
maxvalue 1000;
刪除序列
刪除序列seq_1。
drop sequence seq_1;
4.用戶,寫出相應SQL命令(在自己的計算機上完成)。
創建用戶
(1) 創建一個用戶。注意:如果用戶名的命名違背了公俗良序原則,將給予某些處罰。
create user a
identified by 123456;
(2) 該用戶授予一定的權限
grant connect, resource to a;
grant create session to a;
授予用戶權限
新開一個會話,以新創建的用戶身份連接並對scott中的emp表進行查詢、刪除操作。如果權限不夠,則授予相應權限。最後,回滾事務。
grant select,delete on scott.emp to a;
select * from scott.emp where empno=7369;
delete from scott.emp where empno=7369;
select * from scott.emp where empno=7369;
rollback;
select * from scott.emp where empno=7369;
修改用戶信息
(1) 修改該用戶的口令,然後用新口令重新連接。
alter user a identified by 123;
(2) 封鎖該用戶的賬號,然後解鎖。
alter user a account lock;
alter user a account unlock;
查詢用戶與權限信息
(1) 利用數據字典視圖dba_users、user_sys_privs、user_tab_privs、user_role_privs、session_privs查詢用戶與權限信息。
select * from dba_users;
select * from user_sys_privs;
select * from user_tab_privs;
select * from user_role_privs;
select * from session_privs;
刪除用戶
drop user a201705961429;
5.視圖,針對a_db模式中的表:學生、課程、成績、emp等,創建視圖,視圖名依次命名爲obj1_10、obj1_11、… 、obj1_14
· 查詢每門課程考試成績第一名(可以並列)的學生的學號與課程號,按課程號升序排列。
create view obj1_10 as
select 學號,rank() over(partition by 課程號
order by 分數 asc nulls last)
名次 from a_db.成績 where 課程號='C13';
· 查詢每門課程考試成績第一名(可以並列)的學生的學號與課程號,按課程號升序排列。
create view obj1_11 as
select 學號,課程號 from (select 學號,課程號,rank()
over(partition by 課程號 order by 分數 asc nulls last名次
from a_db.成績 )where 名次=1;
select 學號,課程號 from ( select 學號,課程號,rank()
over(partition by 課程號 order by 分數 asc nulls last名次
from a_db.成績 )where 名次=1;
· 按平均分數對課程連續排名(可以並列),顯示名次、課程號與平均分數(保留2位小數),按名次、課程號升序排列。
create view obj1_12 as
select rank()
over(order by avg(分數) desc) 名次,課程號,round(avg(分數),2)as 平均分數
from a_db.成績 group by 課程號 order by 名次,課程號;
select rank()
over(order by avg(分數) desc) 名次,課程號,round(avg(分數),2)as 平均分數
from a_db.成績 group by 課程號 order by 名次,課程號;
· 查詢每門課程的課程號,以及每門課程考試成績第一名(可以並列)的學生的姓名,按課程號與姓名升序排列。
create view v100 as
select distinct 課程號,姓名
FROM (select 成績.*,rank()over(PARTITION by 課程號
order by 分數 DESC NULLS LAST)RK
from a_db.成績)R left join a_db.學生 on R.學號=學生.學號 where rk=1
order by 課程號,姓名 asc;
select distinct 課程號,姓名
FROM (select 成績.*,rank()over(PARTITION by 課程號
order by 分數 DESC NULLS LAST)RK
from a_db.成績)R left join a_db.學生 on R.學號=學生.學號 where rk=1
order by 課程號,姓名 asc;
· 列出工資在3500到5000之間的員工的姓名,但只取姓名的前5個字符,不足5個則以*補足,按姓名升序排列。
create view obj1_14 as
select rpad(ename,5,'*')as 姓名
from a_db.emp where sal between 3500 and 5000
order by ename asc;
select rpad(ename,5,'*')as 姓名
from a_db.emp where sal between 3500 and 5000
order by ename asc;
三.實驗錯誤解決方案
問題一: ORA-01045問題
1、問題的出現
在實驗項目4(a)中創建“創建用戶”,SQL語句如下:
create user a identified by 123456;
出現錯誤:
ORA-01045:user A lacks CREATE SESSION privilege;
Logon denied;
2、問題分析
-
掌握Oracle創建用戶的操作方法。會使用常用對象解決一些實際問題。
-
掌握Oracle的安全管理方法。
錯誤出現在第1行,表明新建的“用戶”的權限不夠。新建用戶至少需要會話的權利,否則連接也不成功;用戶在會話的權利上,應該有其他操作的權利。但在第1行中沒有給新建用戶會話的權限,所以出錯。
3、解決方案
解決方案如下:
grant connect, resource to a;
grant create session to a;
執行該語句後,用戶已連接,問題解決。
問題二: ORA-00933問題
1、問題的出現
在實驗項目5(3)中創建“obj1_11”表,SQL語句如下:
create table 專業
(ID varchar(5),
course_id varchar(8),
foreign key (ID) references)
;
select 成績.課程號,姓名 from a_db.學生,a_db.成績(
select 課程號,max(分數)m
from a_db.成績 group by 課程號)f0
Where 學生.學號=成績.學號 and 成績.課程號=f0.課程號
and f0.m=成績.分數 order by 成績.課程號,姓名asc;
出現錯誤:
ORA-00933: SQL命令未正確結束
2、問題分析
-
掌握Oracle常用對象的操作方法。會使用常用對象解決一些實際問題。
-
掌握Oracle的安全管理方法。
錯誤出現在第2行,表明外碼定義錯誤中的括號沒有用英文狀態下的括號。sql編程都需要在英文狀態下編程,出現中文字符則會被誤以爲是符號。但在第2行中採用中文括號且selecte語句應用不正確不符合題意,所以出錯。
3、解決方案
解決方案如下:
create view obj1_11 as
select 學號,課程號 from (select 學號,課程號,rank()
over(partition by 課程號 order by 分數 asc nulls last名次
from a_db.成績 )where 名次=1;
select 學號,課程號 from ( select 學號,課程號,rank()
over(partition by 課程號 order by 分數 asc nulls last名次
from a_db.成績 )where 名次=1;
執行該語句後,視圖已創建,問題解決。