I. Tổng quan
1. Câu lệnh SQL
SQL chuẩn bao gồm 40 câu lệnh. Sau đây là danh sách các câu lệnh thường được sử dụng nhất trong số các câu lệnh SQL
|
Câu lệnh |
Chức năng |
|
Thao tác dữ liệu |
|
|
SELECT |
Truy xuất dữ liệu |
|
INSERT |
Bổ sung dữ liệu |
|
UPDATE |
Cập nhật dữ liệu |
|
DELETE |
Xoá dữ liệu |
|
TRUNCATE |
Xóa toàn bộ dữ liệu trong bảng |
|
Định nghĩa dữ liệu |
|
|
CREATE TABLE |
Tạo bảng |
|
DROP TABLE |
Xóa bảng |
|
ALTER TABLE |
Sửa đổi bảng |
|
CREATE VIEW |
Tạo khung nhìn |
|
ALTER VIEW |
Sửa đổi khung nhìn |
|
DROP VIEW |
Xóa khung nhìn |
|
CREATE INDEX |
Tạo chỉ mục |
|
DROP INDEX |
Xóa chỉ mục |
|
CREATE SCHEMA |
Tạo lược đồ csdl |
|
DROP SCHEMA |
Xóa lược đồ csdl |
|
CREATE PROCEDURE |
Tạo thủ tục lưu trữ |
|
ALTER PROCEDURE |
Sửa đổi thủ tục lưu trữ |
|
DROP PROCEDURE |
Xóa thủ tục lưu trữ |
|
CREATE FUNCTION |
Tạo hàm |
|
ALTER FUNCTION |
Sửa đổi hàm |
|
DROP FUNCTION |
Xóa hàm |
|
CREATE TRIGGER |
Tạo trigger |
|
ALTER TRIGGER |
Sửa đổii trigger |
|
DROP TRIGGER |
Xóa trigger |
|
Điểu khiển truy cập |
|
|
GRANT |
Cấp phát quyền cho người sử dụng |
|
REVOKE |
Thu hồi quyền từ người sử dụng |
|
Quản lý giao tác |
|
|
COMMIT |
Ủy thác(kết thúc thành công) giao tác |
|
ROLLBACK |
Quay lui giao tác |
|
SAVE TRANSACTION |
Đánh dấu một điểm trong giao tác |
|
Lập trình |
|
|
DECLARE |
Khai báo biến hoặc định nghĩa con trỏ |
|
OPEN |
Mở một con trỏ để truy xuất kết quả truy vấn |
|
FETCH |
Đọc một dòng trong kết quả truy vấn(sử dụng con trỏ) |
|
CLOSE |
Đóng một con trỏ |
|
EXECUTE |
Thực thi một câu lệnh SQL |
2. Kiểu dữ liệu
|
Tên kiểu |
Mô tả |
|
CHAR (n) |
Kiểu chuỗi với độ dài cố định |
|
NCHAR (n) |
Kiếu chuỗi với độ dài cố định hỗ trợ UNICODE |
|
VARCHAR (n) |
Kiểu chuỗi với độ dài chính xác |
|
NVARCHAR (n) |
Kiểu chuỗi với độ dài chính xác hỗ trợ UNICODE |
|
INTEGER |
Số nguyên có giá trị từ -231 đến 231 – 1 |
|
INT |
Như kiểu Integer |
|
TINYTINT |
Số nguyên có giá trị từ 0 đến 255. |
|
SMALLINT |
Số nguyên có giá trị từ -215 đến 215 – 1 |
|
BIGINT |
Số nguyên có giá trị từ -263 đến 263-1 |
|
NUMERIC (p,s) |
Kiểu số với độ chính xác cố định |
|
DECIMAL (p,s) |
Tương tự kiểu Numeric |
|
FLOAT |
Số thực có giá trị từ -1.79E+308 đến 1.79E+308 |
|
REAL |
Số thực có giá trị từ -3.40E + 38 đến 3.40E + 38 |
|
MONEY |
Kiểu tiền tệ |
|
BIT |
Kiểu bit (có giá trị 0 hoặc 1) |
|
DATETIME |
Kiểu ngày giờ (chính xác đến phần trăm của giây) |
|
SMALLDATETIME |
Kiểu ngày giờ (chính xác đến phút) |
|
TIMESTAMP |
|
|
BINARY |
Dữ liệu nhị phân với độ dài cố định (tối đa 8000 bytes) |
|
VARBINARY |
Dữ liệu nhị phân với độ dài chính xác (tối đa 8000 bytes) |
|
IMAGE |
Dữ liệu nhị phân với độ dài chính xác (tối đa 2,147,483,647 bytes) |
|
TEXT |
Dữ liệu kiếu chuỗi với độ dài lớn (tối đa 2,147,483,647 ký tự) |
|
NTEXT |
Dữ liệu kiếu chuỗi với độ dài lớn và hỗ trợ UNICODE (tối đa 1,073,741,823 ký tự) |
Giá trị NULL
Một cơ sở dữ liệu là sự phản ánh của một hệ thống trong thế giới thực, do đó
các giá trị dữ liệu tồn tại trong cơ sở dữ liệu có thể không xác định được. Một giá trị
không xác định được xuất hiện trong cơ sở dữ liệu có thể do một số nguyên nhân sau:
• Giá trị đó có tồn tại nhưng không biết.
• Không xác định được giá trị đó có tồn tại hay không.
• Tại một thời điểm nào đó giá trị chưa có nhưng rồi có thể sẽ có.
• Giá trị bị lỗi do tính toán (tràn số, chia cho không,…)
Những giá trị không xác định được biểu diễn trong cơ sở dữ liệu quan hệ bởi
các giá trị NULL. Đây là giá trị đặc biệt và không nên nhầm lẫn với chuỗi rỗng (đối
với dữ liệu kiểu chuỗi) hay giá trị không (đối với giá trị kiểu số). Giá trị NULL đóng
một vai trò quan trọng trong các cơ sở dữ liệu và hầu hết các hệ quản trị cơ sở dữ liệu
quan hệ hiện nay đều hỗ trợ việc sử dụng giá trị này.
II. NGÔN NGỮ THAO TÁC DỮ LIỆU
1. Truy xuất dữ liệu với câu lệnh SELECT
Cú pháp chung của câu lệnh SELECT có dạng:
|
SELECT [ALL | DISTINCT][TOP n] danh_sách_chọn [INTO tên_bảng_mới] FROM danh_sách_bảng/khung_nhìn [WHERE điều_kiện] [GROUP BY danh_sách_cột] [HAVING điều_kiện] [ORDER BY cột_sắp_xếp] [COMPUTE danh_sách_hàm_gộp [BY danh_sách_cột]] |
Điều cần lưu ý đầu tiên đối với câu lệnh này là các thành phần trong câu lệnh
SELECT nếu được sử dụng phải tuân theo đúng thứ tự như trong cú pháp. Nếu không,
câu lệnh sẽ được xem là không hợp lệ.
Câu lệnh SELECT được sử dụng để tác động lên các bảng dữ liệu và kết quả
của câu lệnh cũng được hiển thị dưới dạng bảng, tức là một tập hợp các dòng và các
cột (ngoại trừ trường hợp sử dụng câu lệnh SELECT với mệnh đề COMPUTE).
2 Bổ sung, cập nhật và xoá dữ liệu
2.1 Bổ sung dữ liệu
• Bổ sung từng dòng dữ liệu với mỗi câu lệnh INSERT. Đây là các sử dụng
thường gặp nhất trong giao tác SQL.
INSERT INTO tên_bảng[(danh_sách_cột)] VALUES(danh_sách_trị)
• Bổ sung nhiều dòng dữ liệu bằng cách truy xuất dữ liệu từ các bảng dữ liệu
khác.
INSERT INTO tên_bảng[(danh_sách_cột)] câu_lệnh_SELECT
2.2 Cập nhật dữ liệu
Câu lệnh này có cú pháp như sau:
|
UPDATE tên_bảng SET tên_cột = biểu_thức [, ..., tên_cột_k = biểu_thức_k] [FROM danh_sách_bảng] [WHERE điều_kiện] |
2.3 Xoá dữ liệu
Cú pháp :
|
DELETE FROM tên_bảng [FROM danh_sách_bảng] [WHERE điều_kiện] |
Trong câu lệnh này, tên của bảng cần xoá dữ liệu được chỉ định sau DELETE FROM.
Mệnh đề WHERE trong câu lệnh được sử dụng để chỉ định điều kiện đối với các dòng
dữ liệu cần xoá. Nếu câu lệnh DELETE không có mệnh đề WHERE thì toàn bộ các
dòng dữ liệu trong bảng đều bị xoá.
Xoá dữ liệu khi điều kiện liên quan đến nhiều bảng
Nếu điều kiện trong câu lệnh DELETE liên quan đến các bảng không phải là
bảng cần xóa dữ liệu, ta phải sử dụng thêm mệnh đề FROM và sau đó là danh sách tên
các bảng đó. Trong trường hợp này, trong mệnh đề WHERE ta chỉ định thêm điều kiện
nối giữa các bảng
III. NGÔN NGỮ ĐỊNH NGHĨA DỮ LIỆU
3.1 Tạo bảng dữ liệu
Câu lệnh CREATE TABLE có cú pháp như sau
|
CREATE TABLE tên_bảng ( tên_cột thuộc_tính_cột các_ràng_buộc [,... ,tên_cột_n thuộc_tính_cột_n các_ràng_buộc_cột_n] [,các_ràng_buộc_trên_bảng] ) |
Trong đó:
tên_bảng : Tên của bảng cần tạo. Tên phải tuân theo qui tắc định danh và
không được vượt quá 128 ký tự.
tên_cột: là tên của cột (trường) cần định nghĩa, tên cột phải tuân theo
qui tắc định danh và không được trùng nhau trong mỗi một bảng. Mỗi một bảng phải có ít nhất một cột. Nếu bảng có nhiều cột thì định nghĩa của các cột (tên cột, thuộc tính và các ràng buộc) phải phân cách nhau bởi dấu phẩy.
thuộc_tính_cột: Mỗi một cột trong một bảng ngoài tên cột còn có các thuộc tính
bao gồm:
• Kiểu dữ liệu của cột. Đây là thuộc tính bắt buộc phải có đối với mỗi cột.
• Giá trị mặc định của cột: là giá trị được tự động gán cho cột nếu như người sử dụng không nhập dữ liệu cho cột một cách tường minh. Mỗi một cột chỉ có thể
có nhiều nhất một giá trị mặc định.
• Cột có tính chất IDENTITY hay không? tức là giá trị của cột có được tự động tăng mỗi khi có bản ghi mới được bổ sung hay không. Tính chất này chỉ có thể sử
dụng đối với các trường kiểu số.
• Cột có chấp nhận giá trị NULL hay không
các_ràng_buộc:
3.1.1 Ràng buộc CHECK
Ràng buộc CHECK được sử dụng nhằm chỉ định điều kiện hợp lệ đối với dữ
liệu. Mỗi khi có sự thay đổi dữ liệu trên bảng (INSERT, UPDATE), những ràng buộc
này sẽ được sử dụng nhằm kiểm tra xem dữ liệu mới có hợp lệ hay không.
Ràng buộc CHECK được khai báo theo cú pháp như sau:
|
[CONSTRAINT tên_ràng_buộc] CHECK (điều_kiện) |
3.1.2 Ràng buộc PRIMARY KEY
Ràng buộc PRIMARY KEY được sử dụng để định nghĩa khoá chính của bảng.
Khoá chính của một bảng là một hoặc một tập nhiều cột mà giá trị của chúng là duy
nhất trong bảng. Hay nói cách khác, giá trị của khoá chính sẽ giúp cho ta xác định được duy nhất một dòng (bản ghi) trong bảng dữ liệu. Mỗi một bảng chỉ có thể có duy nhất một khoá chính và bản thân khoá chính không chấp nhận giá trị NULL. Ràng buộc PRIMARY KEY là cơ sở cho việc đảm bảo tính toàn vẹn thực thể cũng như toàn vẹn tham chiếu.
Để khai báo một ràng buộc PRIMARY KEY, ta sử dụng cú pháp như sau:
|
[CONSTRAINT tên_ràng_buộc] PRIMARY KEY [(danh_sách_cột)]
|
3.1.3 Ràng buộc UNIQUE
Trên một bảng chỉ có thể có nhiều nhất một khóa chính nhưng có thể có nhiều
cột hoặc tập các cột có tính chất như khoá chính, tức là giá trị của chúng là duy nhất
trong bảng. Tập một hoặc nhiều cột có giá trị duy nhất và không được chọn làm khoá
chính được gọi là khoá phụ (khoá dự tuyển) của bảng. Như vậy, một bảng chỉ có nhiều
nhất một khoá chính nhưng có thể có nhiều khoá phụ.
Ràng buộc UNIQUE được sử dụng trong câu lệnh CREATE TABLE để định nghĩa khoá phụ cho bảng và được khai báo theo cú pháp sau đây:
|
[CONSTRAINT tên_ràng_buộc] UNIQUE [(danh_sách_cột)] |
3.1.4 Ràng buộc FOREIGN KEY
Ràng buộc FOREIGN KEY được sử dụng trong định nghĩa bảng dữ liệu nhằm
tạo nên mối quan hệ giữa các bảng trong một cơ sở dữ liệu. Một hay một tập các cột
trong một bảng được gọi là khoá ngoại, tức là có ràng buộc FOREIGN KEY, nếu giá
trị của nó được xác định từ khoá chính (PRIMARY KEY) hoặc khoá phụ (UNIQUE)
của một bảng dữ liệu khác.
Ràng buộc FOREIGN KEY được định nghĩa theo cú pháp dưới đây:
|
[CONSTRAINT tên_ràng_buộc] FOREIGN KEY [(danh_sách_cột)] REFERENCES tên_bảng_tham_chiếu(danh_sách_cột_tham_chiếu) [ON DELETE CASCADE | NO ACTION | SET NULL | SET DEFAULT] [ON UPDATE CASCADE | NO ACTION | SET NULL | SET DEFAULT] |
Việc định nghĩa một ràng buộc FOREIGN KEY bao gồm các yếu tố sau:
• Tên cột hoặc danh sách cột của bảng được định nghĩa tham gia vào khoá
ngoài.
• Tên của bảng được tham chiếu bởi khoá ngoài và danh sách các cột được
tham chiếu đến trong bảng tham chiếu.
• Cách thức xử lý đối với các bản ghi trong bảng được định nghĩa trong trường
hợp các bản ghi được tham chiếu trong bảng tham chiếu bị xoá (ON
DELETE) hay cập nhật (ON UPDATE). SQL chuẩn đưa ra 4 cách xử lý:
CASCADE: Tự động xoá (cập nhật) nếu bản ghi được tham chiếu
bị xoá (cập nhật).
NO ACTION: (Mặc định) Nếu bản ghi trong bảng tham chiếu
đang được tham chiếu bởi một bản ghi bất kỳ trong bảng được
định nghĩa thì bàn ghi đó không được phép xoá hoặc cập nhật (đối
với cột được tham chiếu).
SET NULL: Cập nhật lại khoá ngoài của bản ghi thành giá trị
NULL (nếu cột cho phép nhận giá trị NULL).
SET DEFAULT: Cập nhật lại khoá ngoài của bản ghi nhận giá trị
mặc định (nếu cột có qui định giá trị mặc định).
3.2 Sửa đổi định nghĩa bảng
Một bảng sau khi đã được định nghĩa bằng câu lệnh CREATE TABLE có thể
được sửa đổi thông qua câu lệnh ALTER TABLE. Câu lệnh này cho phép chúng ta thực hiện được các thao tác sau:
• Bổ sung một cột vào bảng.
• Xoá một cột khỏi bảng.
• Thay đổi định nghĩa của một cột trong bảng.
• Xoá bỏ hoặc bổ sung các ràng buộc cho bảng
Cú pháp của câu lệnh ALTER TABLE như sau:
ALTER TABLE tên_bảng
ADD định_nghĩa_cột |
ALTER COLUMN tên_cột kiểu_dữ_liêu [NULL | NOT NULL] |
DROP COLUMN tên_cột |
ADD CONSTRAINT tên_ràng_buộc định_nghĩa_ràng_buộc |
DROP CONSTRAINT tên_ràng_buộc
3.3 Xoá bảng
Câu lệnh có cú pháp như sau:
DROP TABLE tên_bảng
3.4 Khung nhìn
Một khung nhìn (view) có thể được xem như là một bảng “ảo” trong cơ sở dữ
liệu có nội dung được định nghĩa thông qua một truy vấn (câu lệnh SELECT)
3.4.1 Tạo khung nhìn
Câu lệnh CREATE VIEW được sử dụng để tạo ra khung nhìn và có cú pháp như sau:
CREATE VIEW ten_khung_nhin[ (danh_sach_ten_cot)]
AS
Câu_lệnh_SELECT
3.4.2 Cập nhật, bổ sung và xoá dữ liệu thông qua khung nhìn
Để có thể thực hiện thao tác bổ sung, cập nhật và xoá, một khung nhìn trước tiên phải thoả mãn các điều kiện sau đây:
• Trong câu lệnh SELECT định nghĩa khung nhìn không được sử dụng từ
khoá DISTINCT, TOP, GROUP BY và UNION.
• Các thành phần xuất hiện trong danh sách chọn của câu lệnh SELECT phải
là các cột trong các bảng cơ sở. Trong danh sách chọn không được chứa các
biểu thức tính toán, các hàm gộp.
3.4.3 Sửa đổi khung nhìn
Cú pháp như sau:
ALTER VIEW tên_khung_nhìn [(danh_sách_tên_cột)]
AS
Câu_lệnh_SELECT
3.4.4 Xoá khung nhìn
DROP VIEW tên_khung_nhìn
IV. THỦ TỤC LƯU TRỮ, HÀM VÀ TRIGGER
4.1 Thủ tục lưu trữ (stored procedure)
4.1.1 Tạo thủ tục lưu trữ
Thủ tục lưu trữ được tạo bởi câu lệnh CREATE PROCEDURE với cú pháp như sau:
|
CREATE PROCEDURE tên_thủ_tục [(danh_sách_tham_số)] [WITH RECOMPILE|ENCRYPTION|RECOMPILE,ENCRYPTION] AS Các_câu_lệnh_của_thủ_tục |
Trong đó:
tên_thủ_tục :Tên của thủ tục cần tạo. Tên phải tuân theo qui tắc định danh và không được vượt quá 128 ký tự.
danh_sách_tham_số: Các tham số của thủ tục được khai báo ngay sau tên thủ tục và nếu thủ tục có nhiều tham số thì các khai báo phân cách nhau bởi dấu phẩy. Khai báo của mỗi một tham số tối thiểu phải bao gồm hai phần:
• tên tham số được bắt đầu bởi dấu @.
• kiểu dữ liệu của tham số
Ví dụ: @mamonhoc nvarchar(10)
RECOMPILE : Thông thường, thủ tục sẽ được phân tích, tối ưu và dịch sẵn ở lần gọi đầu tiên. Nếu tuỳ chọn WITH RECOMPILE được chỉ định, thủ tục sẽ được dịch
lại mỗi khi được gọi.
ENCRYPTION :Thủ tục sẽ được mã hoá nếu tuỳ chọn WITH ENCRYPTION được chỉ định. Nếu thủ tục đã được mã hoá, ta không thể xem được nội dung của thủ tục.
các_câu_lệnh_của_thủ_tục: Tập hợp các câu lệnh sử dụng trong nội dung thủ
tục. Các câu lệnh này có thể đặt trong cặp từ khoá BEGIN…END hoặc có thể không.
4.1.2 Lời gọi thủ tục lưu trữ
Như đã thấy ở ví dụ ở trên, khi một thủ tục lưu trữ đã được tạo ra, ta có thể yêu
cầu hệ quản trị cơ sở dữ liệu thực thi thủ tục bằng lời gọi thủ tục có dạng:
tên_thủ_tục [danh_sách_các_đối_số]
Số lượng các đối số cũng như thứ tự của chúng phải phù hợp với số lượng và thứ tự
của các tham số khi định nghĩa thủ tục.
Trong trường hợp lời gọi thủ tục được thực hiện bên trong một thủ tục khác, bên
trong một trigger hay kết hợp với các câu lệnh SQL khác, ta sử dụng cú pháp như sau:
EXECUTE tên_thủ_tục [danh_sách_các_đối_số]
Thứ tự của các đối số được truyền cho thủ tục có thể không cần phải tuân theo
thứ tự của các tham số như khi định nghĩa thủ tục nếu tất cả các đối số được viết dưới
dạng:
@tên_tham_số = giá_trị
4.1.3 Sử dụng biến trong thủ tục
Ngoài những tham số được truyền cho thủ tục, bên trong thủ tục còn có thể sử
dụng các biến nhằm lưu giữ các giá trị tính toán được hoặc truy xuất được từ cơ sở dữ
liệu. Các biến trong thủ tục được khai báo bằng từ khoá DECLARE theo cú pháp như
sau:
DECLARE @tên_biến kiểu_dữ_liệu
Tên biến phải bắt đầu bởi ký tự @ và tuân theo qui tắc về định danh
4.1.4 Giá trị trả về của tham số trong thủ tục lưu trữ
Nếu đối số truyền cho thủ tục khi có lời gọi đến thủ tục là biến, những thay đổi giá trị của biền trong thủ tục sẽ không được giữ lại khi kết thúc quá trình thực hiện thủ tục.
Trong trường hợp cần phải giữ lại giá trị của đối số sau khi kết thúc thủ tục, ta
phải khai báo tham số của thủ tục theo cú pháp như sau:
@tên_tham_số kiểu_dữ_liệu OUTPUT
hoặc:
@tên_tham_số kiểu_dữ_liệu OUT
4.1.5 Tham số với giá trị mặc định
Các tham số được khai báo trong thủ tục có thể nhận các giá trị mặc định. Giá
trị mặc định sẽ được gán cho tham số trong trường hợp không truyền đối số cho tham
số khi có lời gọi đến thủ tục.
Tham số với giá trị mặc định được khai báo theo cú pháp như sau:
@tên_tham_số kiểu_dữ_liệu = giá_trị_mặc_định
4.1.6 Sửa đổi thủ tục
Khi một thủ tục đã được tạo ra, ta có thể tiến hành định nghĩa lại thủ tục đó bằng
câu lệnh ALTER PROCEDURE có cú pháp như sau:
ALTER PROCEDURE tên_thủ_tục [(danh_sách_tham_số)]
[WITH RECOMPILE | ENCRYPTION 1| RECOMPILE,ENCRYPTION]
AS
Các_câu_lệnh_Của_thủ_tục
Câu lệnh này sử dụng tương tự như câu lệnh CREATE PROCEDURE. Việc sửa đổi lại
một thủ tục đã có không làm thay đổi đến các quyền đã cấp phát trên thủ tục cũng như
không tác động đến các thủ tục khác hay trigger phụ thuộc vào thủ tục này.
4.1.7 Xoá thủ tục
Để xoá một thủ tục đã có, ta sử dụng câu lệnh DROP PROCEDURE với cú
pháp như sau:
DROP PROCEDURE tên_thủ_tục
Khi xoá một thủ tục, tất cả các quyền đã cấp cho người sử dụng trên thủ tục đó cũng
đồng thời bị xoá bỏ. Do đó, nếu tạo lại thủ tục, ta phải tiến hành cấp phát lại các quyền
trên thủ tục đó.
4.2 Hàm do người dùng định nghĩa
Hàm là đối tượng cơ sở dữ liệu tương tự như thủ tục. Điểm khác biệt giữa hàm
và thủ tục là hàm trả về một giá trị thông qua tên hàm còn thủ tục thì không. Điều này
cho phép ta sử dụng hàm như là một thành phần của một biêu thức (chẳng hạn trong
danh sách chọn của câu lệnh SELECT).
4.2.1 Định nghĩa và sử dụng hàm
Hàm được định nghĩa thông qua câu lệnh CREATE FUNCTION với cú pháp
như sau:
CREATE FUNCTION tên_hàm ([danh_sách_tham_số])
RETURNS (kiểu_trả_về_của_hàm)
AS
BEGIN
các_câu_lệnh_của_hàm
END
4.2.2 Hàm với giá trị trả về là “dữ liệu kiểu bảng”
CREATE FUNCTION tên_hàm ([danh_sách_tham_số])
RETURNS TABLE
AS
RETURN (câu_lệnh_select)
Cú pháp phải tuân theo các qui tắc sau:
• Kiểu trả về của hàm phải được chỉ định bởi mệnh đề RETURNS TABLE.
• Trong phần thân của hàm chỉ có duy nhất một câu lệnh RETURN xác định giá trị trả về của hàm thông qua duy nhất một câu lệnh SELECT. Ngoài ra, không sử dụng bất kỳ câu lệnh nào khác trong phần thân của hàm.
4.3 Trigger
Ta đã biết các ràng buộc được sử dụng để đảm bảo tính toàn vẹn dữ liệu trong cơ sở dữ liệu. Một đối tượng khác cũng thường được sử dụng trong các cơ sở dữ liệu cũng với mục đích này là các trigger
Mỗi một trigger được tạo ra và gắn liền với một bảng nào đó trong cơ sở dữ
liệu. Khi dữ liệu trong bảng bị thay đổi (tức là khi bảng chịu tác động của các câu lệnh
INSERT, UPDATE hay DELETE) thì trigger sẽ được tự đông kích hoạt.
4.3.1 Định nghĩa trigger
Câu lệnh CREATE TRIGGER được sử dụng để đinh nghĩa trigger và có cú
pháp như sau:
CREATE TRIGGER tên_trigger
ON tên_bảng
FOR {[INSERT][,][UPDATE][,][DELETE]}
AS
[IF UPDATE(tên_cột)
[AND UPDATE(tên_cột)|OR UPDATE(tên_cột)]
…]
các_câu_lệnh_của_trigger
Chuẩn SQL định nghĩa hai bảng logic INSERTED và DELETED để sử dụng
trong các trigger. Cấu trúc của hai bảng này tương tự như cấu trúc của bảng mà trigger
tác động. Dữ liệu trong hai bảng này tuỳ thuộc vào câu lệnh tác động lên bảng làm kích
hoạt trigger; cụ thể trong các trường hợp sau:
• Khi câu lệnh DELETE được thực thi trên bảng, các dòng dữ liệu bị xoá sẽ
được sao chép vào trong bảng DELETED. Bảng INSERTED trong trường
hợp này không có dữ liệu.
• Dữ liệu trong bảng INSERTED sẽ là dòng dữ liệu được bổ sung vào bảng
gây nên sự kích hoạt đối với trigger bằng câu lệnh INSERT. Bảng
DELETED trong trường hợp này không có dữ liệu.
• Khi câu lệnh UPDATE được thực thi trên bảng, các dòng dữ liệu cũ chịu sự
tác động của câu lệnh sẽ được sao chép vào bảng DELETED, còn trong bảng
INSERTED sẽ là các dòng sau khi đã được cập nhật.
4.3.2 Sử dụng mệnh đề IF UPDATE trong trigger
Thay vì chỉ định một trigger được kích hoạt trên một bảng, ta có thể chỉ định
trigger được kích hoạt và thực hiện những thao tác cụ thể khi việc thay đổi dữ liệu chỉ
liên quan đến một số cột nhất định nào đó của cột. Trong trường hợp này, ta sử dụng
mệnh đề IF UPDATE trong trigger. IF UPDATE không sử dụng được đối với câu lệnh
DELETE.
4.3.3 ROLLBACK TRANSACTION và trigger
Một trigger có khả năng nhận biết được sự thay đổi về mặt dữ liệu trên bảng dữ
liệu, từ đó có thể phát hiện và huỷ bỏ những thao tác không đảm bảo tính toàn vẹn dữ
liệu. Trong một trigger, để huỷ bỏ tác dụng của câu lệnh làm kích hoạt trigger, ta sử
dụng câu lệnh:
ROLLBACK TRANSACTION
4.3.4 Sử dụng trigger trong trường hợp câu lệnh INSERT, UPDATE và DELETE có tác động đến nhiều dòng dữ liệu
Có hai giải pháp có thể sử dụng đối với vấn đề này:
• Sử dụng truy vấn con.
• Sử dụng biến con trỏ.
Đăng trong: SQL Server 2000
Giải đáp giúp : ta làm gì trong trường hợp yêu cầu xây dựng trigger tự một phát biểu Ràng buộc toàn vẹn