SQL筆記

一、數(shù)據(jù)定義
1.數(shù)據(jù)模式的創(chuàng)建和撤銷

Create schema <模式名> authorization <用戶名>
Eg:create schema st_co authorization lismith;

Drop schema <模式名> [cascade|restrict]
Eg:drop schema st_co cascade;

一般用法:create database … drop database …

2.基本數(shù)據(jù)類型
a.數(shù)值型
Integer 長整型 (int)
Smallint 短整型
Real 浮點(diǎn)數(shù)
Double precision 雙精度浮點(diǎn)數(shù)
Float(n) 浮點(diǎn)數(shù),精度至少為n位數(shù)字
Numeric(p,d) 定點(diǎn)數(shù),有p位數(shù)字組成(不包括符號(hào),小數(shù)點(diǎn)),小數(shù)點(diǎn)后有d位數(shù)字
也可以寫作:decimal(p,d)或dec(d,d)

b.字符串型
char(n) 長度為n的定長字符串
varchar(n) 具有最大長度為n的變長字符串
c.位串型
bit(n) 長度為n的二進(jìn)制位串
Bit varying(n) 最大長度為n的變長二進(jìn)制位串
d.時(shí)間型
Date 日期,包含年、月、日,形式為YYYY-MM-DD
Time 時(shí)間,包含一日的時(shí)、分、秒,形式為HH:MM:SS
Interval 時(shí)間間隔

e.定義新數(shù)據(jù)類型 create domain …
Create domain person_name char(8);

3.基本表的創(chuàng)建、修改、撤銷

a.創(chuàng)建表
Create table <基本表名>
(<列名 類型>,… <完整性約束>,…)
完整性約束:主鍵子句(primary key)、外鍵子句(foreign key)、檢查子句(check)

eg. Create table T
(T# char(4) not null, Tname char(8) not null, title char(10),
primary key(T#));
Create table C
( C# char(4), Cname char(10) not null, T# char(4),
primary key(C#), foreign key (T#) references T(T#));

b.基本表結(jié)構(gòu)修改
增加列 alter… add…
Alter table <基本表名> add <列名> <類型>
eg.Alter table S sdd sddress varchar(30);
刪除原有列 alter … drop …
Alter table <基本表名> drop <列名> [cascade|restrict]
eg.alter table S drop age cascade;
修改原有列類型、寬度 alter…modify…
Alter table <基本表名> modify <列名> <類型>
eg.alter table S modify s# char(6);

c.基本表的撤銷
撤銷語句 drop table…
Drop table <基本表名> [cascade|restrict]
eg.Drop table S restrict;

4.索引的創(chuàng)建和撤銷 (索引屬于物理存儲(chǔ)路徑概念)
a.索引的創(chuàng)建 create index…
Create [unique] index <索引名> on <基本表名> (<列名序列>)
eg:如在創(chuàng)建S表時(shí)未使用主鍵字句,可以建索引的方法起到主鍵作用
Create unique index S#_index on S(S#);
eg.一個(gè)索引建可以對(duì)應(yīng)多個(gè)列,索引排列可以用ASC升序,DESC降序
Create unique index sc_index on sc(s# asc,c# desc)
b.索引撤銷 drop index …
Drop index <索引名>
eg.drop index S#_index,sc_index;

二、數(shù)據(jù)查詢
5.select 查詢的結(jié)構(gòu)
Select <目標(biāo)表列名>
from<基本表名或視圖序列>
[ where <行條件表達(dá)式>]
[ group by <列名序列>
[ having <組條件表達(dá)式>]]
[ order by <列名[ASC|DESC]>,…]

a.where子句表達(dá)式可使用以下運(yùn)算符:
算術(shù)比較運(yùn)算:< <= > >= = <> !=
邏輯運(yùn)算符: and or not
集合成員資格運(yùn)算符:in not in
謂詞:exists (存在量詞) all some unique
聚合函數(shù):avg min max sum count
嵌套另一個(gè)select語句
b.執(zhí)行過程:(1)讀取from子句中基本表、視圖的數(shù)據(jù),執(zhí)行執(zhí)行笛卡爾積操作;
(2)選取滿足where子句中給出的條件表達(dá)式元組;
(3)按group子句中指定列的值分組,同時(shí)提取滿足having子句中組條件表達(dá)式的那些組;
(4)按select子句中給出的列名或列表達(dá)式求值輸出;
(5)order子句對(duì)輸出的目標(biāo)進(jìn)行排序,按附加說明asc升序,desc降序;
where子句稱為條件子句,group子句稱為分組子句,having子句稱為組條件子句,order子句稱為排序子句;
c.select語句使用技術(shù) :
連接查詢、嵌套查詢、帶存在量詞的嵌套查詢
eg:教學(xué)數(shù)據(jù)庫
教師關(guān)系 T(T#, tname, title)
課程關(guān)系 C(C#, cname, T#)
學(xué)生關(guān)系 S(S#, sname, age, sex)
選課關(guān)系 SC(S#, C#, score)

檢索學(xué)習(xí)課程號(hào)為C2的學(xué)生學(xué)號(hào)與姓名,這個(gè)查詢要從基本表S和SC中檢索數(shù)據(jù)
第一種寫法(連接查詢):
Select S.S#, sname from S,SC where S.S#=SC.S# AND C#=‘C2’;
第二種寫法(嵌套查詢):
Select S#,sname from where S# IN
(select S# from SC where C#=‘C2’);
嵌套查詢的執(zhí)行效率比連接查詢的笛卡爾積效率高
第三種寫法(使用存在量詞的嵌套查詢):
select S#,sname from where exists
(select * from SC where SC.S#=S.S# AND C#=‘C2’)
6.查詢中的限制和規(guī)定
a.select子句的規(guī)定
select子句用于描述查詢輸出的表格結(jié)構(gòu) select [all|distinct] <列名或表達(dá)式序列> | *
distinct去重,all默認(rèn)選項(xiàng);允許表達(dá)式包含+、-、*、/
b.集合的并、交、差操作 union 、intersect、except
(select 查詢語句1) union all (select 查詢語句2)
(select 查詢語句1) intersect all (select 查詢語句2)
(select 查詢語句1) except all (select 查詢語句2)
c.條件表達(dá)式中的比較操作
(1)算術(shù)比較操作
算術(shù)比較運(yùn)算符: < , <=, >, >=,=, != between…and…/ not between… and…
(2)字符串匹配操作
字符串匹配操作符: like / not like ,可使用兩種通配符: “%” “ _”
為使字符串包含 “%” “ _” ,可以定義轉(zhuǎn)義字符,在like比較中使用escape關(guān)鍵字來定義轉(zhuǎn)義字符,如果使用反斜線(\)作為轉(zhuǎn)義字符,如:like ‘a(chǎn)b%cd%’ escape ‘\’ 匹配所有以“ab%cd”開頭字符串;
(3)空值比較
測試是否值為空,is null / is not null;
涉及到含有算術(shù)運(yùn)算+ - * / ,表達(dá)式里有一個(gè)空值時(shí),表達(dá)式的值也為空;
(4)集合成員比較
判斷元組是否在集合中:<元組> [not] in (<集合>)
集合成員算術(shù)比較 : <元組> 比較運(yùn)算符 all/some/any (<集合>)
(5)集合空否測試
使用謂詞exists測試集合是否為空/非空,
[not] exists (<集合>)
(6)集合中重復(fù)元組是否存在測試
[not] unique (<集合>)
7.嵌套查詢的改進(jìn)和寫法
嵌套使查詢顯得非常復(fù)雜,難于理解,為降低復(fù)雜度,使用兩個(gè)方法改進(jìn):導(dǎo)出表和臨時(shí)視圖;
導(dǎo)出表的使用
Select SC.S#
from SC,(select avg(score) from SC group by S#) as result (avg_score)
Group by SC.S#
having avg (SC.score) >= all (result.avg_score);
可以把子查詢定義為導(dǎo)出表(命名為result),移到外層查詢的from子句;
b.with子句和臨時(shí)視圖
SQL允許用戶用with子句定義一個(gè)臨時(shí)視圖(result,即子查詢),置于select語句的開始處;
With result (avg_score) as
select avg(score)
from sc group by S#
Select S# from SC,result
Group by S# having avg(score) >=all (result.avg_score);

8.基本表的連接操作

a.連接類型
[inner] jion 內(nèi)連接
Left [outer] jion 左外連接
Right [outer] jion 右外連接
Full [outer] jion 完全外連接
b.連接條件
Natural 寫在連接類型左邊
On 等值連接條件 寫在連接類型右邊
Using (A1,A2,…An) 寫在連接類型右邊

9.遞歸查詢
用with recursive子句可定義遞歸查詢,先創(chuàng)建一個(gè)視圖,再附加關(guān)鍵字recursive,指明這個(gè)臨時(shí)視圖是遞歸的。
eg. 假設(shè)課程見間有先修與后繼的聯(lián)系,關(guān)系模式 course (c#,cname,pc#),其屬性表示表示課程號(hào)、課程名、直接先修課的課程號(hào)。
select語句表示這個(gè)遞歸查詢:
With recursive pre (c#,pc#) as
((select c# ,pc# from course)
union
(select course.c#,per.pc# from course ,pre where course.pc# =pre.c#))
Select * from pre;

三、數(shù)據(jù)更新
1.數(shù)據(jù)插入
a.單組/多組數(shù)據(jù)插入
Insert into <基本表名> [(列名序列)]
values(<元組值>…<元組值>)
b.查詢結(jié)果插入
Insert into <基本表名> [(列名序列)]
<select 查詢語句>
c.表插入
Insert into <基本表1> [(列名序列)]
table <基本表2>
eg.基本表SC中,把平均成績大于80分的男同學(xué)和平均成績存入另一已存在的基本表
S_SCORE(S#,AVG_SCORE)中;
Insert into S_SCORE (S#,AVG_SCORE)
select S#,avg(SCORE)
from sc
where S# in
(select S# from S where SEX=‘M’)
group by S#
having avg(SCORE)>80;
2.數(shù)據(jù)刪除 從基本表中刪除元組
Delete from <基本表名>
[where <條件表達(dá)式>]
eg.把C4課程中小于該課程平均成績的成績?cè)M從基本表SC中刪除
Delete from SC
where C#=‘C4’ and
score <(select avg(score) from SC where C#=‘C4’);
3.數(shù)據(jù)修改 修改基本表元組的某些列的值
Update <基本表>
Set <列名>=<值表達(dá)式> / row=(<元組>)
[where <條件表達(dá)式>]
eg.
基本表SC中,當(dāng)課程C4的成績低于該課程的平均成績時(shí),成績提高5%
Update SC
Set score =score * 1.05
Where C# =‘C4’
and score <(select avg(score) from SC where C# =‘C4’);
兩次引用的SC是不相關(guān)的,內(nèi)層select語句引用后,隨后對(duì)成績修改都以初始平均成績做依據(jù)。

基本表C中,把課程號(hào)為C5的元組修改為(C5,DB,T3)
Update C
Set row =(‘C5’,’DB’,’T3’)
Where C# =‘C5’;
四、視圖 View
1.視圖的創(chuàng)建
Create view <視圖名> (<列表序列>)
as <select 查詢語句>
eg.數(shù)據(jù)庫基本表S、SC、C,用戶經(jīng)常要用到S#、Sname、Cname、Score等列數(shù)據(jù),可以建立視圖;
Create view student_score(S#,Sname,Cname,Score)
as select S.S#,Sname,Cname,Score
from S,SC,C
where S.S# = SC.S# and SC,C#=C.C# ;
視圖中的列名、順序與select子句的列名、順序一致,因此視圖的列名可以省略。
2.視圖的撤銷
Drop view <視圖名>
eg. Drop view student_score;
3.對(duì)視圖的操作
如果視圖是從單基本表中使用選擇、投影操作導(dǎo)出的,并包含了基本表的主鍵,這樣的視圖稱為:行列子集視圖,行列子集視圖可以被執(zhí)行更新操作;允許用戶更新的的視圖在定義時(shí)必須加上“with check option” 短語。
eg.create view s_male as select S#,Sname,age from S where sex=‘M’;
Insert into s_male values (‘s28’,’wu’,’18’)
五、嵌入式SQL
多數(shù)系統(tǒng)采用預(yù)處理方式,先用預(yù)處理程序?qū)υ闯绦蜻M(jìn)行掃描,識(shí)別出SQL語句,并處理成主語言的函數(shù)調(diào)用形式,然后再用主語言的編譯程序編譯成目標(biāo)程序;
數(shù)據(jù)庫和主語言程序間信息的傳遞是通過共享變量實(shí)現(xiàn)的;
SQL_STATE是特殊的共享變量,有5位字符組成的字符組,表示執(zhí)行語句發(fā)生的各種錯(cuò)誤情況,
當(dāng)SQL語句執(zhí)行成功 ,SQL_STATE=00000;當(dāng)未找到元組,SQL_STATE=02000;
1.嵌入式SQL語句格式:
Exec SQL <SQL語句> end_exec C語言程序規(guī)定結(jié)束標(biāo)志不用end_exce,而是分號(hào) ;。
允許嵌入式的SQL語句引用主語言的程序變量(共享變量),規(guī)定:引用時(shí)變量前必須加冒號(hào):,
這些變量由主語言定義,并用SQL的declare語句說明;
eg.
Exec SQL begin declare section;
char sno[5],name[9];
char SQL_STATE [6];
Exec SQL end declare section;
STATE的長度是6,而不是5,是由于C語言規(guī)定變量值在做字符串使用是有結(jié)束符”\0” 引起;
2.游標(biāo) Cursor
SQL語句處理的是記錄集合,而主語言語句一次只能處理一個(gè)記錄,因此需要用游標(biāo)機(jī)制,把集合操作轉(zhuǎn)換成單記錄處理方式;
a.游標(biāo)定義語句(declare)
Exec SQL declare <游標(biāo)> cursor for
<select 語句>
End_exec

b.游標(biāo)打開語句 (open),該語句執(zhí)行游標(biāo)定義中的select語句,同時(shí)游標(biāo)處于活動(dòng)狀態(tài);
Exec SQL open <游標(biāo)名> end_exec
游標(biāo)處于活動(dòng)狀態(tài)時(shí),可以修改和刪除游標(biāo)指向的元組;
c.游標(biāo)推送語句(fetch),此時(shí)游標(biāo)推進(jìn)一行,并把游標(biāo)指向的行(當(dāng)前行)中的值取出,送到共享變量;
Exec SQL fetch from <游標(biāo)> into <變量表> end_exec
d.游標(biāo)關(guān)閉 (close)
Exec SQL close <游標(biāo)名> end_exec
3.嵌入式SQL的使用技術(shù)
a.不涉及游標(biāo)的SQL DML語句
由于insert、delete、update語句不返回?cái)?shù)據(jù)結(jié)果,只對(duì)數(shù)據(jù)庫進(jìn)行操作,因此只加上前綴標(biāo)識(shí)
exec SQL 和end_exec,就能嵌入在主語言程序中使用。對(duì)于select語句,如果已知查詢結(jié)果是單元組,可以在語句中增加一個(gè)into子句,把找到的值送到相應(yīng)的共享變量中。
eg.
a.在基本表S中,根據(jù)共享變量givensno的值檢索學(xué)生的姓名、年齡和性別
Exec SQL select sname, age, sex
Into :sn, :sa , :ss
From s
Where s# =: givensno;
b.基本表S中插入一個(gè)新學(xué)生,屬性值已在相應(yīng)的共享變量中
Exec SQL insert into S(s#, snane, age)
values(:givensno, :sn, :sa);
c.從基本表SC中刪除一個(gè)學(xué)生的各個(gè)成績,學(xué)生姓名在共享變量sn中給出
Exec SQL delete from SC
Where s# = (select s# from s where sname =:sn)
d.課程名為maths的成績?cè)黾幽硞€(gè)值,改值在共享變量raise中給出
Exec SQL update sc
set score =score +:raise
Where c# in (select c# from c where cname =‘maths’)

b.涉及游標(biāo)的SQL DML語句
當(dāng)select語句查詢結(jié)果是多個(gè)元組時(shí),此時(shí)主語言程序無法使用,要用游標(biāo)機(jī)制把多個(gè)元組一次一次傳送給主程序;具體過程如下:
1.先用游標(biāo)定義語句定義一個(gè)游標(biāo)與某個(gè)select語句對(duì)應(yīng)。
2.游標(biāo)用open語句打開后,處于活躍狀態(tài),此時(shí)游標(biāo)指向查詢結(jié)果的第一個(gè)元組之前。
3.每次執(zhí)行一次fetch語句,游標(biāo)指向下一個(gè)元組,并把其值送到共享變量,供程序處理;如此重復(fù),直至所有查詢結(jié)果處理完畢。
4.最后用close語句關(guān)閉游標(biāo)。關(guān)閉的游標(biāo)可以重新被打開,與新的查詢結(jié)果相聯(lián)系,但在沒有打開之前,不能使用。
eg.在基本表SC中檢索某學(xué)生(學(xué)號(hào)由共享變量givensno給出)的學(xué)習(xí)成績信息(s#,c#,score),下面是該查詢的C函數(shù),(這里使用C語言中宏定義NO_MORE_TUPLRES,表示找不到元組時(shí),值為1);

#define NO_MORE_TUPLES  !(strcmp(SQLSTATE,”02000”))
Void sel( )
{ exec SQL begin declare section;
    char sno[5] , cno[5] , givensno[5];
    int g;
    char SQLSTARE[6];
Exec SQL end declare section;
Exec SQL declare scx cursor for
    select s#, c#, score
    from sc
    where s# =:givensno;
Exec SQL  open  scx;
while(1)
    {exec SQL fetch from scx
        into :sno, :cno, :g ;
    if (NO_MORE_TUPLES) break;
printf(“%s, %s, %d”,sno,cno,g)
}
Exec SQL close scx;

}

對(duì)游標(biāo)指向元組的修改或刪除操作
eg.如果對(duì)找到的成績做如下處理:刪除不及格的成績,60-69分改為70分,再顯示該學(xué)生信息,那么例中 while(1) {…} 語句改寫為下面形式;

while(1)
      {exec SQL fetch from scx
    into :sno, :cno, :g
    if (NO_MORE_TUPLES) break;
    if (g<60)
    exec SQL delete from sc
        where current of scx;
    else
    {if (g<70)
        {exec SQL update sc
         set score =70 where current of scx;
        g=70;
        }
    printf(“%s, %s, %d”,sno,cno,g)
    }
        }

六、SQL數(shù)據(jù)控制
1.SQL的完整性約束
a.域約束
SQL可以用 create domain 語句定義新的域,還可以出現(xiàn)check子句
Create domain color char(6) default ‘???’
constraint valld_colors
check (value in (‘red’,’yellow’,’blue’,’???’))
Create table part (…, color color,…)
b.基本表約束
候選鍵約束:unique(<列名序列>) 或 primary key (<列名序列>)
外鍵定義:foreign key (<列名序列>)
references <參照表> [(<列名序列>)] [on delete <參照動(dòng)作>] [on update <參照動(dòng)作>]
參照動(dòng)作有5種方式:
no action (默認(rèn)) :修改(刪除)參照表時(shí)對(duì)依賴表沒有影響;
cascade方式:將依賴表中與參照表表中要修改(刪除)的主鍵值相應(yīng)的所有外鍵一起修改(刪除);
restrict方式:只有當(dāng)依賴表中沒有外鍵值與參照表中要修改(刪除)的主鍵值相對(duì)應(yīng)時(shí),系統(tǒng)才能修改(刪除)參照表中的主鍵值,否則拒絕修改(刪除)此操作;
set null方式:修改(刪除)參照表中主鍵值時(shí),將依賴表中所有與這個(gè)主鍵值相對(duì)應(yīng)的外鍵值均設(shè)為空值;
set default方式:與set null方式類似,只是把外鍵值均置為預(yù)先設(shè)置默認(rèn)值。
檢查約束的定義 check(<條件表達(dá)式>)
插入元組或修改元組時(shí),若元組不滿足條件,系統(tǒng)拒絕插入或修改操作;
2.觸發(fā)器
觸發(fā)器稱為事件-條件-動(dòng)作規(guī)則(event-condition-action rule,ECA規(guī)則)
一個(gè)觸發(fā)器由3部分組成:
事件,事件是針對(duì)數(shù)據(jù)庫發(fā)生插入、刪除、修改等操作時(shí),將開始工作;
條件,觸發(fā)器將測試條件是否成立,如果條件成立,就執(zhí)行相應(yīng)的動(dòng)作,否則什么也不做。
動(dòng)作,如果觸發(fā)器測試滿足預(yù)定的條件,那么就有DBMS執(zhí)行這些操作;這些動(dòng)作能使觸發(fā)事件不發(fā)生,即撤銷事件;

eg.元組級(jí)觸發(fā)器
選課關(guān)系SC的一個(gè)觸發(fā)器,在修改關(guān)系SC的成績時(shí),要求修改后的成績一定不能比原來的低,否則就拒絕修改;

create trigger trig1
after update of grade on sc
referencing
  old as oldtudle
  new as newtuple
for each row
when (oldtuple.grade>newtuple.grade)
  update sc
  set grade=oldtuple.grade
  where c#=newtuple.c#

觸發(fā)器結(jié)構(gòu)組成
觸發(fā)器的命名
動(dòng)作時(shí)間 觸發(fā)事件 目標(biāo)表名
舊值和新值的別名表
觸發(fā)動(dòng)作:動(dòng)作間隔尺寸 動(dòng)作時(shí)間條件 動(dòng)作體
動(dòng)作時(shí)間:觸發(fā)器的動(dòng)作時(shí)間定義了何時(shí)想要執(zhí)行觸發(fā)器動(dòng)作,在SQL標(biāo)準(zhǔn)規(guī)定可以是before、after;before表示在觸發(fā)事件進(jìn)行以前,測試when條件是否滿足,若滿足則先執(zhí)行動(dòng)作部分操作,再執(zhí)行觸發(fā)事件操作(可忽略when條件是否滿足);after表示在觸發(fā)事件完成以后,測試when條件是否滿足,若滿足則執(zhí)行動(dòng)作部分操作。
在oracle系統(tǒng)中,還規(guī)定另一種動(dòng)作事件instead of ,表示在觸發(fā)事件發(fā)生時(shí),只要滿足when條件,執(zhí)行動(dòng)作的操作,而觸發(fā)事件的操作不再執(zhí)行。
觸發(fā)事件:觸發(fā)事件定義了激活觸發(fā)器的SQL數(shù)據(jù)更新語句的類別,觸發(fā)事件有3類,update、delete和insert 。只有在update時(shí),允許后面跟“of <屬性表>”短語;其他兩種情況是對(duì)整個(gè)元組操作,不允許跟“of <屬性表>”短語;
目標(biāo)表(on子句):當(dāng)目標(biāo)表的數(shù)據(jù)被更新(插入、刪除、修改),將激活觸發(fā)器;
舊值和新值的別名表(references子句):
如果觸發(fā)事件是update ,應(yīng)該用old as 、new as 子句定義修改前后的元組變量。如果是delete,那么只要用old as子句定義元組變量;如果是insert ,那么只要用new as子句定義元組變量。
觸發(fā)動(dòng)作:
動(dòng)作間隔尺寸,for each子句定義,
兩種形式:for each row 元組級(jí)觸發(fā)器,每個(gè)修改的元組都要檢查一次
for each statement 語句級(jí)觸發(fā)器,對(duì)SQL語句的執(zhí)行結(jié)果進(jìn)行檢查。
動(dòng)作時(shí)間條件,用when子句定義,可以是任意表達(dá)式;當(dāng)觸發(fā)器被激活時(shí),如果條件是ture,則執(zhí)行,否則不執(zhí)行;
動(dòng)作體,定義觸發(fā)動(dòng)作本身,即當(dāng)觸發(fā)器被激活時(shí)想要DBMS執(zhí)行的SQL語句,動(dòng)作體若是一個(gè)SQL語句,直接寫上即可。若是一系列SQL語句,則用分號(hào)定界,再使用begin atomic...end限定。
語句級(jí)觸發(fā)器
在關(guān)系SC中修改課程號(hào)C#,也就是學(xué)生的選課登記需做變化,,在關(guān)系SC中有個(gè)約束,要求保持每門課程選修人數(shù)不超過50.如果修改課程號(hào)后,違反這個(gè)約束,那么不做這個(gè)更改。

create trigger trig2
instead of update of c# on sc
referencing
  old_table as oldstuff
  new_table as newstuff
when (50>=all(select count (s#)
                        from ((sc except oldstuff) union newstuff)
                        group by c#))
begin atomic
  delete from sc
  where (s#,c#,grade) in oldstuff;
  insert into sc
    select * from newstuff
end

在語句級(jí)觸發(fā)器中,不能直接引用修改前后的元組,但可以引用修改前后的元組集。設(shè)舊元組集由被修改(刪除)的元組,新的元組集由修改元組新值或插入元組組成。那么可以用old_table as oldstuff 和 new_table as newstuff 說明兩個(gè)關(guān)系變量oldsteff 和newstuff。
撤銷觸發(fā)器語句 drop trigger trig1;
3.權(quán)限
DBMS的權(quán)限子系統(tǒng)允許有特定存取權(quán)的用戶有選擇地和動(dòng)態(tài)地把這些權(quán)限授予其他用戶。
用戶選擇使用6類權(quán)限:select、insert 、delete 、update 、references 、usage.
references允許用戶定義新關(guān)系,引用其他關(guān)系的主鍵作為外鍵;
usage權(quán)限允許用戶使用已定義的域。
授予其他用戶使用關(guān)系和視圖權(quán)限的語句格式如下:
grant <權(quán)限表> on <數(shù)據(jù)庫元素> to <用戶名表> [with grant option]
如果權(quán)限表包括全部6種權(quán)限,可以用關(guān)鍵字all privileges代替;數(shù)據(jù)庫元素可以是關(guān)系、視圖、域。短語with grant option表示獲得權(quán)限的用戶還能獲得傳遞權(quán)限,把獲得的權(quán)限轉(zhuǎn)授給其他用戶。
grant select,update on sc to wang with grant option
grant update(grade) on sc to wen
回收語句
revoke <權(quán)限表> on <數(shù)據(jù)庫元素> from <用戶名表> [restrict|cascade]
cascade,表示回收權(quán)限時(shí)要連鎖回收
restrict,不存在回收權(quán)限時(shí)才能回收權(quán)限,否則系統(tǒng)拒絕回收。
回收語句revoke可用revoke grant option for代替,回收轉(zhuǎn)授出去的轉(zhuǎn)讓權(quán)限,而不回收轉(zhuǎn)授出去的權(quán)限。
revoke select,update on s from wang cascade

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容