模式對象和用戶權限管理

一.實驗目標

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、問題分析

  1. 掌握Oracle創建用戶的操作方法。會使用常用對象解決一些實際問題。

  2. 掌握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、問題分析

  1. 掌握Oracle常用對象的操作方法。會使用常用對象解決一些實際問題。

  2. 掌握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;

執行該語句後,視圖已創建,問題解決。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章