Tải bản đầy đủ (.docx) (18 trang)

Các lệnh trong sql hay gặp potx

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (190.88 KB, 18 trang )

Các thao tác cơ bản trên cơ sở dữ liệu SQL
(SQL server managerment studio 2008)

UPDATE tblsv SET [Mức cảnh cáo]='Mức 0’, [Tín chỉ đăng ký]=70
WHERE IDSV>=1 AND IDSV<=48; (điều kiện với IDSV trong bảng)


INSERT INTO tblsv
VALUES(49,20102576,N'Vũ');
Nếu cấu trúc của bảng tblsv có cột thứ nhất int, thứ 2 int, cột 3 nvarchar
Note: Nếu nhập cho cột nào thì chọn cột ấy (chú ý cột not Null thì phải nhập)
INSERT INTO tblsv(MSSV,[Tên]) VALUES (20101221,N’An’)
 ! "#$%&'((
INSERT INTO T2
SELECT 2, '' UNION ALL
SELECT 3, '' UNION ALL
SELECT 4, '' UNION ALL
SELECT 5, ''
)*+(((
DELETE FROM tblkhoavien (chọn bảng)
WHERE IDKhoaVien = 1; (xóa tất cả record có IDKhoa/Viện = 1)
Xóa cả tất cả bản record và cả thuộc tính của record đó trong bảng tblkhoavien
,-&
ALTER TABLE ChucVu (chọn bảng)
ADD [Số điện thoại] nvarchar(15); (tên cột và kiểu dữ liệu)
Thêm thuộc tính not null cho cột [Số điện thoại]
alter table Chucvu
alter column [Số điện thoại] nvarchar(15) not null (hoặc null chuyển về null)
.*+(
ALTER TABLE ChucVu
DROP COLUMN [Số điện thoại]; (tên cột Số điện thoại)


Note: Xóa bảng DROP TABLE ChucVu;
/01234
SELECT [MSSV] (chọn 10 sinh viên đầu tiên -> viết Select top 10 [MSSV])

,[Họ đệm]
,[Tên]
,[Ngày tháng năm sinh]
,[Quê quán]
,[Gia đình]
,[Trình độ sinh viên năm thứ]
,[Học lớp]
,[Khoa/Viện]
,[CT đào tạo]
,[Tín chỉ đạt]
,[Tín chỉ tích lũy]
,[Tín chỉ nợ]
,[Tín chỉ đăng ký]
,[Mức cảnh cáo]
,[HP thiếu điểm]
,[HP không tính]
,[GPA]
,[Ghi chú]
,[Số điện thoại]
FROM [DANHSACH1].[dbo].[tblsvk55]
WHERE [MSSV]=20101373 (với số, hoặc [Học lớp] = N'ĐTVT 10-K55' với chuỗi ký tự)
5%678
SELECT [MSSV] (chọn 10 sinh viên đầu tiên -> viết Select top 10 [MSSV])

,[[Họ đệm]
,[Tên]

,[Ngày tháng năm sinh]
,[Quê quán]
,[Gia đình]
,[Trình độ sinh viên năm thứ]
,[Học lớp]
,[Khoa/Viện]
,[CT đào tạo]
,[Tín chỉ đạt]
,[Tín chỉ tích lũy]
,[Tín chỉ nợ]
,[Tín chỉ đăng ký]
,[Mức cảnh cáo]
,[HP thiếu điểm]
,[HP không tính]
,[GPA]
,[Ghi chú]
,[Số điện thoại]
FROM [DANHSACH1].[dbo].[tblsvk55]
ORDER BY IDSV DESC; (DESC giảm, ASC tăng theo IDSV)
Note: Select Distinct trước cột để lọc không trùng lặp, lệnh này ít dùng
9:8(
;:8<=>(&?+"Select count@ABfromC-whereDEFGH.
;:8CI+(&?+@(JBK"Select count@DEFBfrom C-
;:8(!L(MK"Select Distinct@N]) fromC-
O &7PQR (
;0&FSD@BT#7T#T%TU"Select AVG@DEFBfromC-whereDEFGH
- Hàm thống kê: Select [Học lớp], AVG(GPA) from tblsvk55 Group by [Học lớp]
10. Dùng bí danh để đặt lại tên cột hay bảng khi hiển thị bằng tiếng Việt cột
Select HoDem as [Họ Đệm], Ten as [Tên] from tblsvk55
Note: Có thể dùng bí danh tên bảng from tblsvk55 as tbsvkhoa55

11. Tạo bảng mới
create table DulieuV
(
ID int not null identity(1,1),
MSSV int, Hoặc primary key,
TenSV nvarchar(30), Hoặc check(TenSV>''),
pwd varchar(max), Hoặc check(length(pwd)>=6)and len(pwd)<=12)
primary key(MSSV,ID), Hai khóa chính
unique(ID,MSSV), Đảm bảo giá trị khác nhau
check(ID>0 and MSSV>0 and (len(pwd)>=6)and len(pwd)<=12) Kiểm tra điều kiện nhập
)
12. Back up full dữ liệu lên đĩa
B1. Back up CSDL
BACKUP DATABASE DulieuSV TO DISK = 'E:\SQLSIS\Back up\DulieuSV.bak' WITH INIT
B2. Ghi lại thời điểm xảy ra Back up (sự cố)
SELECT GETDATE()
B3. Thiết đặt chỉ một người dùng CSDL
ALTER DATABASE DulieuSV SET SINGLE_USER WITH ROLLBACK IMMEDIATE
B4. Back up file LOG lên đĩa
BACKUP LOG DulieuSV TO DISK = 'E:\SQLSIS\Back up\DulieuSV.trn' WITH INIT
B5. Khôi phục lại dữ liệu
RESTORE DATABASE DulieuSV FROM DISK = 'E:\SQLSIS\Back up\DulieuSV.bak' WITH
NORECOVERY
RESTORE DATABASE DulieuSV FROM DISK = 'E:\SQLSIS\Back up\DulieuSV.trn' WITH STOPAT='
2012-06-24 19:22:26.230’
B6. Chuyển CSDL sang nhiều người dùng
ALTER DATABASE DulieuSV SET MULTI_USER
)412-&C678V8S
SELECT * FROM QLSV
WHERE Hoclop = N'ĐTVT 10-K55' Điều kiện

ORDER BY Ten COLLATE Vietnamese_CI_AS Sắp xếp cột tên

 
 !"#$%#&'%#& %#((
)* !"+,#-.-/#0%%'1#((
%2* !34-#%-#%,3
%2 !-4#
!2%
5%%6
5%%6
%4785698#3478!:569(4;8
%,%478569%,8#3478!:569%,(;8
%!<=
%5%%6
!>?,
5%%6
4%;-4756
<9%%!>?,
<9%%5%%6#@%-8#@8
<9%%5%%6#@%'8#@8
<9%%5%%6#@,98
!AB'C
'5%%6#D
E,
FG'CH!<#-#4#4%-#4## 
FGI,)!;#'#J#;%,#4-
FG'C%I K!-#%4#;#
FG)LMN!-#
!2%,
2%, G)

6
+6#
6OD

2% GI,)
6
+64-'-#
6 OD%#
;&$%,+&$

%!<=,
%6
((!4)
4)P,Q,
6

((%%4!<=)
6
%%4
((%4!4)L%
6
%46OD%
((4-'-!4'=L
4I,)'=LRS4))I%TG'4(FS
AC-CAM)L%,-24'=LUVW
'=,% I% U=CTATNX%A=TG%Y
6
%4+6%
,%
6

4-'-+6
((;%,'-!4I,)'=,%I
6
;%,'-;&$%,+&$
((;!4I,)4ZA[
6
;\'%,\;%6
<9!<4?,,
<96
],%
FG4RC^AB'
FG4R'_X-S
(( !4, I%,
%6+6#6#
#F8F,-`6a.8#
((!4,W,' I%,
%&%b
+6#6#;%46
%&%b
+b6#b6#;%4b%6
((%!AT'SJXc I%,4G
+6#6#&4
%6d
;%46
e&4fg(D
!<=,W,
;%46
;%46e+67E]h
!<=%I),,
6

!>,%,,
6
F%4%,7
e+6ih
6
F%4%,7h
e+6f]+6ij
h- kJ-
5YN- k!#%##-
$l%*N!#'#e
I4M,=4!4#4<#4# ,
h(- kA,
m!5k,
m
;%46
!54)H)
6#&40
;%46
((e!54)Hn,o,
6#&40
;%46
e&40fp(D
((%-!5 Iq<S%AC4r%
6#&40
;%46
%-&40#6
((!5,['?,Q,Z

;%46
((%!5n,AR%,,

%]6#&40
;%46
%-&40#6
h(E- kr,J-
((e
5k,,Ts%,,t =T,P,T,Gk,
,Ts=%,?,-!
F6#%,
;%4F6
e%,74<%,;%4F6
((e
5k,,Ts%,,t =T,Gk%ZGU,
,Ts=%,?,-!(
F6#%,
;%4F6
e%,%E%,;%4F6%-%,
t%,u2%4)*,[%EA=IT,Gk IT,G
U(6It^kuc,,Ts4IT,P4%,*Gk
IGU
((e
5k,,Ts=T,Gkn,'?,Gk%,
?,-4IGk%,n,%ZA [4I) B
 (F6# (%,
;%4F6 
e (%,74<%,;%4F6e$%,7 ($%,
t%,u B,[T,GkT,'?,Gk%,%I
?,-4IGk%,n, (A=t,%IQ,u<A[<4
 =ATNc'?,P,'C4T, GT,Gkn,
(
h(]- kM,=4%J-o,%,J-

((,%-!H,'%L
5HTN,t ^, GW,J
#%m
;%4F6
,%-
vS4H4 IH%,?,-
b%#%m
;%4F6
,%-b%
LM,*%W,n,
$%,#4%,
;%4F6
,%-$%,
(( ,!54)H=4QN
wAS4HTN,,Ts5$n, IHTN,,Ts5I)
#%m
;%4F6
,%-
 ,7@5$8#7@5F8
w,n,I%=M,*GODDDDD
$%,#4%,
;%4F6
,%-$%,
 ,4%,fODDDDDD
w,wI%=HTN,,TsGD
#%m
;%4F6
,%-
 ,%mfD
h(h- k,%J-ox%,J-

((x%!,lZ,y4zAB'
bl,t  It  IA[T,
F6(F6#&$%,(&$
;%4F6x%&$%,%F6(7&$%,(+&$
((;%x%!k-kL I,lS= G
k-k,t 'C,t =JJ'?,N,{I4z
JJ'?,=%,,A[T,
F6(F6#&$%,(&$
;%4F6;%x%&$%,%F6(7&$%,(+&$
((,%x%!k-kL I,lS= GL
k-k,A[T,,l Gt #A[T,'?,NuATN,l
G)Y,(d?,t '?,=4zJJQN
F6(F6#&$%,(&$
;%4F6,%x%&$%,%F6(7&$%,(+&$
((;%x%!k-WL I,lS=
k-k,t S'?,=JJQNU,l G)Y,
Ik,A[T,'C'?,=t (
F6(F6#&$%,(&$
;%4F6,%x%&$%,%F6(7&$%,(+&$
((%x%! BkZ=C,l
blW,t  GkA[T,(FT *-S=4t  I=A[
T,U,ALu=4mn,(n,AR%t ^k,l GA[
T,(n,%t ^,l GA[T,( IS|TSG
t ^4(
F6(F6#&$%,(&$
;%4F6%x%&$%,
;!4'%44)H
}4k~•&€•‚ƒ,TsQ,%,+„…5†
+Y'4)ATN2%#,-%,4u^
?, B,4G2%A=(&% *-‡,=C'k%,

4)4-P,',%,,-
m
;%44(%(-
eif
}4k0ˆFb,TsQ,%,~•&€•‚ƒ
+Y'4),ATN2%%,4)#?, B,A=uATN^
%,,-%xL^, W2%(6U *-‡,=C<4
,%,P,- k,-%x(,%
,TsQ,2%='CI@ƒ8
m
;%4F%e(%(-%x
e<-7\ƒ\
%, L|I-#‡,k-k,,-%xF%e
T,wk-,,,TsQ,#,{I,,=<-I@ƒ8
}4k‰) B4)0ˆFb
+Y'4))%,,ATN2%#,-%4%,u^?,
B) W2%()L)u^A[,4I)A=) B(6U *-
AC<4)%,4),#‡,=C- k,-%4
Š<
Š<7;%4-%xe47\"4%-\
m;%4-%4e7Š<
%, L|I-#'%SŠ<'C#A=k-,"4%- I%S
Š<#rk-k)%,,-%44I=P,Š<#‹,=,{I
,"4%-(&% *-u'ATNk)%,,"4%-
>|,,24
d%,#**,# I,
Š<+6#6 ED
%Š< #F\T,\
%Š< E#F\…S\
m;%4Š<

d%,#,'W%,, W'%# I,
Š<+6#6 ED
%Š<
"4%-•&#34
;%4F%e(%("4%-
m;%4Š<
>|,S24
Š4%-
Š74<ƒ$;%4F%e(%(%
m;%4F%e(%(%eƒ$f7Š
;!'4
4?U4%
Œ+?U^*
Œ+?U42,TGe%'
Œ+?UJ%
 kABT
ŒXTW
ŒXkJ%
ŒL%I K,-
ŒX%I-
ŒX•,
'4
Œ
Œ0,%ZJ%
Œ0,%%Zn,%e%Z)
ŒTs,3%Z)%4
Œ+HJ%ATNCP,,%Z'='- 
+HJ,
Œ2%T4HJ
Œ$T,T4HJQ,'=#Q,,

Œd=L4-'- I'=,%I;%,'-
Œ6kAB%I K4S;,-
F,?,A[,{ I<>_
Œ%AHTN,T#,#)
Œ$RA[,{ I,!#%#
Œ$R**!##
Œ$R- k!x%#%#%x%#%#%#,%
Œ$R*U I%!###,%
;!JGA[,{,
 kAB B%I K
Œ%I KXC-,-!4-'-#J#-
Œ%I K4S;,-!;%,'-#'
Œ%I K4B%4,-!;#;%,'-#'#% 
Œ%I K,TsQ,,-!#%%#,,
YN G%I K
ŒŽI,)'C4'%!y4zAB'I%A=
ŒŽI,)4ZA[;%!=4),[4ZA[
ŒŽI,)-kJ%!,[%,)'?,ATNQ,Z
ŒŽI,)'=,%I;%,'-%!,[N G)'=L
T,^,
ŒŽI,)'=L4-'-%!-k I'?,H,
Œ)LA[-%-!=CATNa,XA),
Œ)L'?,H,%%-!'?,ATNlACH,
'C
b[[t!
H,-!,##4#-
HX<k<w!3%#
b[HXL<!4#4
b[B!4%-#44%-
b[s,!4#44

Y!# #<## #<#
Y[t!-# -#4,
'C'!%## #44#J3
Integrity Constraints (Các ràng buộc toàn vẹn)
Bên cạnh các hạn chế đơn giản về cấu trúc và kiểu quy định bởi định nghĩa schema cơ sở, các ràng buộc về tính toàn vẹn
(Integrity constraints) quy định các ràng buộc đối với dữ liệu cho phép trong cơ sở dữ liệu.
Question: Chúng ra đã được xem một số kiểu của ràng buộc toàn vẹn. Dó là những kiểu gì?
1.
2.
3.
Và tại sao chúng ta sử dụng các Ràng buộc toàn vẹn?
1. Để bắt các lỗi khi nhập dữ liệu vào
2. Làm các tiêu chí về tính đúng đắc khi ghi nhận các cập nhật CSDL
3. Để đảm bảo một sự thống nhất trên dữ liệu trong database
4. Cho hệ thống biết về dữ liệu - nó có thể chọn cách lưu trữ dữ liệu hoặc xử lý truy vấn một cách tương ứng
-> Nhiều ràng buộc hữu ích không thể được biểu diễn bằng các kiểu ràng buộc mà ta đã bàn đến.
Ví dụ một schema:
Student(ID, name, address, GPA, SAT)
Campus(location, enrollment, rank)
Apply(ID, location, date, major, decision)
Ví dụ về Ràng buộc:
* Một sinh viên có điểm GPA < 3.0 chỉ có thể đăng ký vào campus có rank (cấp bậc) > 4
* Một hồ sơ (applications) có trường date trước 1/1/03 phải có trường decision không được NULL (Tức là phải có quyết
định)
* Apply.ID và Apply.location phải tương ứng với Student.ID và Campus.location
* Campus.rank <= 10
Các kiểu Ràng buộc toàn vẹn của Cơ sở dữ liệu quan hê:
1. Không được NULL (Non-null)
2. Khoá
3. Toàn vẹn tham chiếu (Referential integrity)

4. Ràng buộc thuộc tính (Attribute-based)
5. Ràng buộc bản ghi (Tuple-based)
6. Ràng buộc chung (General assertions)
Khai báo (Declaring) và Enforcing (bắt buộc phải thực hiện) các Ràng buộc
Các Ràng buộc có thể khai báo tại 2 thời điểm:
1. Khai báo trong schema gốc. Ràng buộc phải có hiệu lực sau khi bulk loading - đọc theo khối.
2. Khai báo sau. Các Ràng buộc phải có hiệu lực trong Database hiện thời.
Sau khi khai báo, nếu câu lệnh SQL khiến cho một ràng buộc nào đó bị xâm phạm thì (trong phần lớn tình huống) bất kỳ
một ảnh hưởng nào của câu lệnh sẽ bị undo và sinh ra một lỗi run-time.
Các ràng buộc Non-Null
Các tính chất này không cho phép các giá trị NULL
Ví dụ:
CREATE TABLE Student (ID integer NOT NULL,
name char(30) NOT NULL,
address char(100),
GPA float NOT NULL,
SAT integer)
Các ràng buộc về khoá (Key)
Ví dụ:
ID là Key (khoá) cho Student =>
Không thể có 2 bản ghi trong Student có cùng giá trị thuộc tính ID
Có 2 loại Key trong SQL:
* PRIMARY KEY (Khoá chính): Tối đa là 1 Key cho 1 bảng, được tự động là non-NULL, tự động là indexed (chỉ mục) (trong
Oracle)
* UNIQUE (Đơn nhất): Có thể có nhiều Key trong một bảng, tự động là indexed (trong Oracle)
Có 2 cách để định nghĩa key trong SQL:
* Tại thuộc tính key
* Tách riêng, bên trong table definition
Ví dụ:
CREATE TABLE Student (ID integer PRIMARY KEY,

name char(30),
address char(100),
GPA float,
SAT integer,
UNIQUE (name,address))
Referential Integrity (Toàn vẹn tham chiếu)
Đây là một loại Ràng buộc rất quan trọng và thông dụng
Ví dụ:
* Nếu ID xuất hiện trong bảng Apply thì nó cũng xuất hiện trong bảng Student.
* Nếu location xuất hiện trong bảng Apply thì nó cũng xuất hiện trong bảng Campus.
Câu hỏi: Hướng ngược lại trong ví dụ này có đúng không ?
Terminology (thuật ngữ):
* Apply.ID "references (tham chiếu)" Student.ID
* "Referential integrity" nghĩa là giá trị đựoc tham chiếu phải luôn tồn tại
* Không được có "dangling tuples" - các bản ghi không được kết nối trong mối liên hệ tham chiếu (referencing relation).
Ví dụ : Trong bảng Apply không được có bản ghi mà Apply.ID không có trong Student.ID
Referential Integrity trong SQL
* Thuộc tính được tham chiếu đến (Referenced attribute) phải là PRIMARY KEY hoặc UNIQUE (vd: Student.ID, Student.
(name,address), Campus.location)
* Thuộc tính tham chiếu (Referencing attribute) được gọi là FOREIGN KEY - Khoá ngoài (vd: Apply.ID, Apply.location)
2 cách để định nghĩa referential integrity trong SQL:
* Tại thuộc tính tham chiếu (referencing attribute)
* Tách riêng, bên trong bảng tham chiểu (referencing table)
Ví dụ:
CREATE TABLE Apply(ID integer REFERENCES Student(ID),
location char(25),
date char(10),
major char(10),
decision char,
FOREIGN KEY (location) REFERENCES Campus(location))

Có thể bỏ qua tên của thuộc tính được tham chiếu đến nếu tên của nó giống với tên của thộc tính tham chiếu:
ID integer REFERENCES Student,
Có thể có ràng buộc toàn vẹn cho tham chiếu nhiều thuộc tính.
Có thể có ràng buộc toàn vẹn cho tham chiếu nhiều thuộc tính trong một bảng.
Ví dụ:
Dorm(first-name,
last-name,
room-number,
phone-number,
roommate-first-name,
roommate-last-name,
PRIMARY KEY (first-name,last-name),
FOREIGN KEY (roommate-first-name,roommate-last-name)
REFERENCES Dorm(first-name,last-name))
Referential Integrity Enforcemence
Xem xét 2 bảng R(P, ) và S( , F references R(P), )
Question: Hành động thay đổi nào có thể làm cho Ràng buộc bị vi phạm?
1.
2.
3.
4.
Các lệnh Insert/Update (Chèn/Cập nhật) vào bảng S vi phạm các Ràng buộc là không được phép.
* Phải chèn giá trị được tham chiếu đến trước, sau đó chèn giá trị tham chiếu
* Trừ khi việc kiểm tra ràng buộc bị trì hoãn (sẽ không nói đến chủ đề này)
Các lệnh xoá khỏi bảng R giá trị được tham chiếu đến:
(figure)
Có 4 lựa chọn:
1. Không cho phép (mặc định)
2. SET NULL - thiết lập tất cả các giá trị đang tham chiếu đến bản ghi cần xoá thành NULL
3. SET DEFAULT - thiết lập tất cả các giá trị đang tham chiếu đến bản ghi cần xoá thành một giá trị mặc định cho cột đó

(lỗi nếu giá trị mặc định không có trong thuộc tính R.P)
4. CASCADE - xoá tất cả các bản ghi đang tham chiếu đến bản ghi cần xoá
Cập nhật vào R.P: giống như lựa chọn thứ 4 (CASCADE mirrors update)
See textbook for syntax.
Question: Tại sao thuộc tính được tham chiếu đến lại phải là PRIMARY KEY hoặc là UNIQUE?
Ràng buộc về giá trị của thuộc tính (Attribute-Based)
Ràng buộc về giá trị cho Relation.Attribute
* Các kiểu đặc biệt là một dạng của ràng buộc attribute-based.
* Yêu cầu Non-null cũng là một dạng của ràng buộc attribute-based.
Cú pháp SQL: Thêm "CHECK(<condition>)" vào thuộc tính.
<condition> giống như một mệnh đề Where của SQL, có thể chỉ đến bản thân thuộc tính.
Ví dụ:
CREATE TABLE Student (
GPA float CHECK(GPA <= 4.0 AND GPA > 0),
)
CREATE TABLE Apply (
decision char CHECK(decision in ('Y','N','U'))
)
Điều kiện có thể phức tạp hơn, vd: là một truy vấn con (subqueries).
Ví dụ:
Apply (
major char(10) CHECK(major NOT IN
(SELECT dept-name FROM Dept
WHERE status = 'full'))
)
Question: Chúng ta có thể encode (biểu diễn, thực hiện) ràng buộc referential integrity theo cách này không?
-> Ràng buộc về giá trị chỉ được kiểm tra khi chèn và cập nhật vào mối liên hệ, KHÔNG kiểm tra khi thay đổi mối liên hệ
tham chiếu trong các truy vấn con (subqueries) đây là một lỗ hổng trong kiểm tra ràng buộc.
Ràng buộc dựa trên các bản ghi (Tuple-Based)
Ràng buộc giá trị cho Relation.Tuple

Tương tự với ràng buộc thuộc tính, ngoại trừ CHECK được áp dụng cho toàn bộ tuple.
=> được chỉ rõ riêng trong định nghĩa bảng
Ví dụ:
CREATE TABLE Campus(location char(25),
enrollment integer,
rank integer,
CHECK(enrollment >= 10,000 OR rank > 5)
(Ví dụ thực hiện enrollment < 10,000 => rank > 5)
Với ràng buộc attribute-based, có thể có các truy vấn con (subquerie) nhưng ràng buộc chỉ được kiểm tra khi chính
relation bị thay đổi
Ràng buộc chung (General Assertions)
Ràng buộc trong toàn bộ các relation hoặc toàn bộ database
Trong SQL, lệnh đứng riêng:
CREATE ASSERTION <name> CHECK(<condition>)
Ví dụ: Trung bình GPA là > 3.0 và trung bình SAT là > 1200
CREATE ASSERTION HighVals CHECK(
3.0 < (SELECT avg(GPA) FROM Student) AND
1200 < (SELECT avg(SAT) FROM Student))
Ví dụ: Một sinh viên với GPA < 3.0 chỉ được đăng ký vào campus có rank (cấp bậc) > 4.
CREATE ASSERTION RestrictApps CHECK(
NOT EXISTS (SELECT * FROM Student, Apply, Campus
WHERE Student.ID = Apply.ID
AND Apply.location = Campus.location
AND Student.GPA < 3.0 AND Campus.rank <= 4))
Các ràng buộc (Assertion) được kiểm tra cho mỗi thay đổi mà có thể vi pham nó.
Question: Những hành động nào có thể vi phạm assertion HighVals?
Question: Những hành động nào có thể vi phạm assertion RestrictApps?
Q: Chúng ta có thể encode (biểu diễn, thực hiện) Ràng buộc toàn ven bằng cách này được không?
Triggers
* Tổng quát hơn Ràng buộc (Constraint)

* Có trong SQL-99 nhưng không có trong SQL2, có trong hầu hết các sản phẩm dưới một hình thức nào đó
Dạng chung:
CREATE TRIGGER <name>
BEFORE | AFTER | INSTEAD OF <events>
<referencing clause> // tuỳ chọn
FOR EACH ROW // tuỳ chọn
WHEN (<condition>) // tuỳ chọn
<action>
<events> có thể là:
INSERT ON R
DELETE ON R
UPDATE [OF A1, A2, , An] ON R
AFTER <events> là thông dụng và hữu ích nhất. Đừng lo lắng quá nhiều đến BEFORE và INSTEAD OF, chúng có thể lộn xộn.
* <condition>: giống như general assertion
* <action>: một chuỗi câu lệnh SQL
* FOR EACH ROW
o Nếu có, thực hiện trigger một lần cho mỗi bản ghi bị thay đổi.
o Nếu không có, thực hiện trigger cho mỗi câu lệnh liên quan.
o Thuật ngữ: "row-level - mức bản ghi" với "statement-level - mức câu lệnh"
o Trong cả 2 trường hợp trên, trigger được thực hiện sau khi câu lệnh được hoàn tất.
* <referencing clause>:
REFERENCING <thing1> AS <var1> <thing2> AS <var2>, etc.
<thing> có thể là:
o OLD TABLE - Giá trị cũ của các bản ghi bị xoá hoặc cập nhật, row-level hoặc statement-level, DELETE hoặc UPDATE
o NEW TABLE - giá trị hiện thời của các bản ghi được thêm vào hoặc cập nhật, row-level hoặc statement-level, INSERT
hoặc UPDATE
o OLD ROW - Giá trị cũ của bản ghi bị xoá hoặc cập nhật, chỉ có row-level, DELETE hoặc UPDATE
o NEW ROW - Giá trị hiện thời của bản ghi được thêm vào hoặc cập nhật, chỉ có row-level, INSERT hoặc UPDATE
Ví dụ: Nếu một bản ghi hồ sơ được chèn vào cho một sinh viên có GPA > 3.9 và SAT > 1450 cho (trường) Berkeley, thiết
lập giá trị decision (quyết định) thành "Y".

CREATE TRIGGER AutoAccept
AFTER INSERT ON Apply
REFERENCING NEW ROW AS NewApp
FOR EACH ROW
WHEN (NewApp.location = 'Berkeley' AND
3.9 < (SELECT GPA FROM Student WHERE ID = NewApp.ID) AND
1450 < (SELECT SAT FROM Student WHERE ID = NewApp.ID))
UPDATE Apply
SET decision = 'Y'
WHERE ID = NewApp.ID
AND location = NewApp.location
AND date = NewApp.date
Question: Chúng ta có thể có được hiệu quả tương tự bằng cách dùng các assertion không?
Ví dụ: Một trigger tương tự như trên nhưng không dùng FOR EACH ROW
CREATE TRIGGER AutoAccept
AFTER INSERT ON Apply
REFERENCING NEW TABLE AS NewApps
UPDATE Apply
SET decision = 'Y'
WHERE (ID,location,date) IN (SELECT ID,location,date FROM NewApps)
AND location = 'Berkeley'
AND 3.9 < (SELECT GPA FROM Student WHERE ID = Apply.ID)
AND 1450 < (SELECT SAT FROM Student WHERE ID = Apply.ID)
Ví dụ: Nếu số enrollment (đăng ký) vào campus tăng từ dưới 7,000 thành trên 7,000, thì xoá tất cả các hồ sơ đăng ký vào
campus đó mà có date sau ngày 2/15/03 và thiết lập tất cả các hồ sơ trước 2/15/03 có decision là "Y" thành "U".
CREATE TRIGGER TooMany
AFTER UPDATE OF enrollment ON Campus
REFERENCING OLD ROW AS OldVal NEW ROW AS NewVal
FOR EACH ROW
WHEN (OldVal.enrollment <= 7,000 AND NewVal.enrollment > 7,000)

DELETE FROM Apply
WHERE location = NewVal.location AND date > 2/15/03;
UPDATE Apply
SET decision = 'U'
WHERE location = NewVal.location
AND decision = 'Y'
Question: Chúng ta có thể có được hiệu quả tương tự dùng assertions?
Triggers và assertions:
* Triggers mềm dẻo hơn và có ý nghĩa hơn assertions.
* Trong các thực hành, sử dụng thông dụng nhất của triggers là cài đặt các assertion.
* Có thể kiểm tra các lỗi assertion và raise. Can check assertions and raise errors; cũng có thể tự động sửa chữa các vi
phạm.
Những thứ mà Oracle hỗ trợ
* Ràng buộc Non-null và ràng buộc Key một cách đầy đủ.
* Ràng buộc Referential integrity với xử lý mặc định cộng với "ON DELETE SET NULL" và "ON DELETE CASCADE"
* Ràng buộc Attribute-based và tuple-based CHECK không có truy vấn con (subqueries)
* Không hỗ trợ general assertions
* Một số đặc điểm về Trigger:
o INSTEAD OF cho những trigger chỉ đề xem (đừng thử nó ở nhà)
o Không hỗ trợ OLD TABLE hoặc NEW TABLE trong mệnh đề REFERENCING
o Mệnh đề Referencing sử dụng OLD thay cho OLD ROW và NEW thay cho NEW ROW
o Mệnh đề WHEN chỉ được chấp nhận với FOR EACH ROW
o Không hỗ trợ truy vấn con (subqueries) trong điều kiện WHEN
o <action> là thủ tục PL/SQL với một vài hạn chế
* Tương tác giữa các Trigger: các hạn chế quan trọng và khá phức tạp

×