Cõu lệnh REVOKE được sử dụng để thu hồi quyền đó được cấp phỏt cho người dựng. Tương ứng với cõu lệnh GRANT, cõu lệnh REVOKE được sử dụng trong hai trường hợp:
• Thu hồi quyền đó cấp phỏt cho người dựng trờn cỏc đối tượng cơ sở dữ liệu.
• Thu hồi quyền thực thi cỏc cõu lệnh trờn cơ sở dữ liệu đó cấp phỏt cho người dựng.
4.3.1 Thu hồi quyền trờn đối tượng cơ sở dữ liệu:
Cỳ phỏp cõu lệnh REVOKE sử dụng để thu hồi quyền đó cấp phỏt trờn đối tượng cơ sở dữ liệu cú cỳ phỏp như sau:
REVOKE [GRANT OPTION FOR]
ALL [PRIVILEGES]| cỏc_quyền_cần_thu_hồi [(danh_sỏch_cột)] ON tờn_bảng | tờn_khung_nhỡn |ON tờn_bảng | tờn_khung_nhỡn [(danh_sỏch_cột)]
|ON tờn_thủ_tục |ON tờn_hàm
FROM danh_sỏch_người_dựng [CASCADE]
Cõu lệnh REVOKE cú thể sử dụng để thu hồi một số quyền đó cấp phỏt cho người dựng hoặc là thu hồi tất cả cỏc quyền (ALL PRIVILEGES).
Vớ dụ 4.4: Thu hồi quyền thực thi lệnh INSERT trờn bảng LOP đối với người dựng
thuchanh.
REVOKE INSERT ON lop
FROM thuchanh
Giả sử người dựng thuchanh đó được cấp phỏt quyền xem dữ liệu trờn cỏc cột HODEM, TEN và NGAYSINH của bảng SINHVIEN, cõu lệnh dưới đõy sẽ thu hồi quyền đó cấp phỏt trờn cột NGAYSINH (chỉ cho phộp xem dữ liệu trờn cột HODEM và TEN)
REVOKE SELECT
ON sinhvien(ngaysinh) FROM thuchanh
Khi ta sử dụng cõu lệnh REVOKE để thu hồi quyền trờn một đối tượng cơ sở dữ liờu từ một người dựng nỏo đú, chỉ những quyền mà ta đó cấp phỏt trước đú mới được thu hồi, những quyền mà người dựng này được cho phộp bởi những người dựng khỏc vẫn cũn cú hiệu lực. Núi cỏch khỏc, nếu hai người dựng khỏc nhau cấp phỏt cựng cỏc quyền trờn cựng một đối tượng cơ sở dữ liệu cho một người dựng khỏc, sau đú người thu nhất thu hồi lại quyền đó cấp phỏt thỡ những quyền mà người dựng thứ hai cấp phỏt vẫn cú hiệu lực.
Vớ dụ 4.5: Giả sử trong cơ sở dữ liệu ta cú 3 người dựng là A, B và C. A và B đều cú quyền sử dụng và cấp phỏt quyền trờn bảng R. A thực hiện lệnh sau để cấp phỏt quyền xem dữ liệu trờn bảng R cho C:
GRANT SELECT ON R TO C
và B cấp phỏt quyền xem và bổ sung dữ liệu trờn bảng R cho C bằng cõu lệnh:
GRANT SELECT, INSERT ON R TO C
Như vậy, C cú quyền xem và bổ sung dữ liệu trờn bảng R. Bõy giờ, nếu B thực hiện lệnh:
REVOKE SELECT, INSERT ON R FROM C
Người dựng C sẽ khụng cũn quyền bổ sung dữ liệu trờn bảng R nhưng vẫn cú thể xem được dữ liệu của bảng này (quyền này do A cấp cho C và vẫn cũn hiệu lực).
Nếu ta đó cấp phỏt quyền cho người dựng nào đú bằng cõu lệnh GRANT với tuỳ chọn WITH GRANT OPTION thỡ khi thu hồi quyền bằng cõu lệnh REVOKE phải chỉ định tuỳ chọn CASCADE. Trong trường hợp này, cỏc quyền được chuyển tiếp cho những người dựng khỏc cũng đồng thời được thu hồi.
Vớ dụ 4.6: Ta cấp phỏt cho người dựng A trờn bảng R với cõu lệnh GRANT như sau:
GRANT SELECT ON R TO A
WITH GRANT OPTION
sau đú người dựng A lại cấp phỏt cho người dựng B quyền xem dữ liệu trờn R với cõu lệnh:
GRANT SELECT ON R TO B
Nếu muốn thu hồi quyền đó cấp phỏt cho người dựng A, ta sử dụng cõu lệnh REVOKE như sau:
REVOKE SELECT ON NHANVIEN FROM A CASCADE
Cõu lệnh trờn sẽđồng thời thu hồi quyền mà A đó cấp cho B và như vậy cả A và B đều khụng thể xem được dữ liệu trờn bảng R.
Trong trường hợp cần thu hồi cỏc quyền đó được chuyển tiếp và khả năng chuyển tiếp cỏc quyền đối với những người đó được cấp phỏt quyền với tuỳ chọn WITH GRANT OPTION, trong cõu lệnh REVOKE ta chỉ định mệnh đề GRANT OPTION FOR.
Vớ dụ 4.7: Trong vớ dụ trờn, nếu ta thay cõu lệnh:
REVOKE SELECT ON NHANVIEN FROM A CASCADE
bởi cõu lệnh:
REVOKE GRANT OPTION FOR SELECT ON NHANVIEN
Thỡ B sẽ khụng cũn quyền xem dữ liệu trờn bảng R đồng thời A khụng thể chuyển tiếp quyền mà ta đó cấp phỏt cho những người dựng khỏc (tuy nhiờn A vẫn cũn quyền xem dữ liệu trờn bảng R).
4.3.2 Thu hồi quyền thực thi cỏc cõu lờnh:
Việc thu hồi quyền thực thi cỏc cõu lệnh trờn cơ sở dữ liệu (CREATE DATABASE, CREATE TABLE, CREATE VIEW,...) được thực hiện đơn giản với cõu lệnh REVOKE cú cỳ phỏp:
REVOKE ALL | cỏc_cõu_lệnh_cần_thu_hồi FROM danh_sỏch_người_dựng
Vớ dụ 4.8: Để khụng cho phộp người dựng thuchanh thực hiện lệnh CREATE TABLE trờn cơ sở dữ liệu, ta sử dụng cõu lệnh:
REVOKE CREATE TABLE FROM thuchanh
C Chhươươngng 55 T THHỦỦ TTỤỤCC LLƯƯU U TTRRỮỮ, , HHÀÀM M VVÀ À TTRRIIGGGGEERR 5.1 Thủ tục lưu trữ (stored procedure) 5.1.1 Cỏc khỏi niệm
Như đó đề cập ở cỏc chương trước, SQL được thiết kế và cài đặt như là một ngụn ngữđể thực hiện cỏc thao tỏc trờn cơ sở dữ liệu như tạo lập cỏc cấu trỳc trong cơ sở dữ liệu, bổ sung, cập nhật, xoỏ và truy vấn dữ liệu trong cơ sở dữ liệu. Cỏc cõu lệnh SQL được người sử dụng viết và yờu cầu hệ quản trị cơ sở dữ liệu thực hiện theo chế độ tương tỏc.
Cỏc cõu lệnh SQL cú thể được nhỳng vào trong cỏc ngụn ngữ lập trỡnh, thụng qua đú chuỗi cỏc thao tỏc trờn cơ sở dữ liệu được xỏc định và thực thi nhờ vào cỏc cõu lệnh, cỏc cấu trỳc điều khiển của bản thõn ngụn ngữ lập trỡnh được sử dụng.
Với thủ tục lưu trữ, một phần nào đú khả năng của ngụn ngữ lập trỡnh được đưa vào trong ngụn ngữ SQL. Một thủ tục là một đối tượng trong cơ sở dữ liệu bao gồm một tập nhiều cõu lệnh SQL được nhúm lại với nhau thành một nhúm với những khả năng sau:
• Cỏc cấu trỳc điều khiển (IF, WHILE, FOR) cú thể được sử dụng trong thủ tục.
• Bờn trong thủ tục lưu trữ cú thể sử dụng cỏc biến như trong ngụn ngữ lập trỡnh nhằm lưu giữ cỏc giỏ trị tớnh toỏn được, cỏc giỏ trịđược truy xuất được từ cơ sở dữ liệu.
• Một tập cỏc cõu lệnh SQL được kết hợp lại với nhau thành một khối lệnh bờn trong một thủ tục. Một thủ tục cú thể nhận cỏc tham số truyền vào cũng như cú thể trả về cỏc giỏ trị thụng qua cỏc tham số (như trong cỏc ngụn ngữ lập trỡnh). Khi một thủ tục lưu trữ đó được định nghĩa, nú cú thể được gọi thụng qua tờn thủ tục, nhận cỏc tham số truyền vào, thực thi cỏc cõu lệnh SQL bờn trong thủ tục và cú thể trả về cỏc giỏ trị sau khi thực hiện xong. Sử dụng cỏc thủ tục lưu trữ trong cơ sở dữ liệu sẽ giỳp tăng hiệu năng của cơ sở dữ liệu, mang lại cỏc lợi ớch sau:
• Đơn giản hoỏ cỏc thao tỏc trờn cơ sở dữ liệu nhờ vào khả năng module hoỏ cỏc thao tỏc này.
• Thủ tục lưu trữ được phõn tớch, tối ưu khi tạo ra nờn việc thực thi chỳng nhanh hơn nhiều so với việc phải thực hiện một tập rời rạc cỏc cõu lệnh SQL tương đương theo cỏch thụng thường.
• Thủ tục lưu trữ cho phộp chỳng ta thực hiện cựng một yờu cầu bằng một cõu lệnh đơn giản thay vỡ phải sử dụng nhiều dũng lệnh SQL. Điều này sẽ làm giảm thiểu sự lưu thụng trờn mạng.
• Thay vỡ cấp phỏt quyền trực tiếp cho người sử dụng trờn cỏc cõu lệnh SQL và trờn cỏc đối tượng cơ sở dữ liệu, ta cú thể cấp phỏt quyền cho người sử dụng thụng qua cỏc thủ tục lưu trữ, nhờ đú tăng khả năng bảo mật đối với hệ thống.
5.1.2 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.
Vớ dụ 5.1: Giả sử ta cần thực hiện một chuỗi cỏc thao tỏc như sau trờn cơ sở dữ liệu 1. Bổ sung thờm mụn học cơ sở dữ liệu cú mó TI-005 và số đơn vị học
trỡnh là 5 vào bảng MONHOC
2. Lờn danh sỏch nhập điểm thi mụn cơ sở dữ liệu cho cỏc sinh viờn học lớp cú mó C24102 (tức là bổ sung thờm vào bảng DIEMTHI cỏc bản ghi với cột MAMONHOC nhận giỏ trị TI-005, cột MASV nhận giỏ trị lần lượt là mó cỏc sinh viờn học lớp cú mó C24105 và cỏc cột điểm là NULL).
Nếu thực hiện yờu cầu trờn thụng qua cỏc cõu lệnh SQL như thụng thường, ta phải thực thi hai cõu lệnh như sau:
INSERT INTO MONHOC
VALUES('TI-005','Cơ sở dữ liệu',5) INSERT INTO DIEMTHI(MAMONHOC,MASV) SELECT ‘TI-005’,MASV
FROM SINHVIEN
WHERE MALOP='C24102'
Thay vỡ phải sử dụng hai cõu lệnh như trờn, ta cú thểđịnh nghĩa mụt thủ tục lưu trữ với cỏc tham số vào là @mamonhoc, @tenmonhoc, @sodvht và @malop như sau:
CREATE PROC sp_LenDanhSachDiem(
@mamonhoc NVARCHAR(10), @tenmonhoc NVARCHAR(50), @sodvht SMALLINT, @malop NVARCHAR(10)) AS BEGIN
INSERT INTO monhoc
VALUES(@mamonhoc,@tenmonhoc,@sodvht)
SELECT @mamonhoc,masv FROM sinhvien
WHERE malop=@malop END
Khi thủ tục trờn đó được tạo ra, ta cú thể thực hiện được hai yờu cầu đặt ra ở trờn một cỏch đơn giản thụng qua lũi gọi thủ tục:
sp_LenDanhSachDiem 'TI-005','Cơ sở dữ liệu',5,'C24102'
5.1.3 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ị Vớ dụ 5.2: Lời gọi thủ tục ở vớ dụ trờn cú thể viết như sau: sp_LenDanhSachDiem @malop='C24102', @tenmonhoc='Cơ sở dữ liệu', @mamonhoc='TI-005', @sodvht=5 5.1.4 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. Vớ dụ dưới đõy minh hoạ việc sử dụng biến trong thủ tục
Vớ dụ 5.3: Trong định nghĩa của thủ tục dưới đõy sử dung cỏc biến chứa cỏc giỏ trị truy xuất được từ cơ sở dữ liệu.
CREATE PROCEDURE sp_Vidu(
@malop1 NVARCHAR(10), @malop2 NVARCHAR(10)) AS
DECLARE @tenlop1 NVARCHAR(30) DECLARE @namnhaphoc1 INT
DECLARE @tenlop2 NVARCHAR(30) DECLARE @namnhaphoc2 INT
SELECT @tenlop1=tenlop,
@namnhaphoc1=namnhaphoc FROM lop WHERE malop=@malop1
SELECT @tenlop2=tenlop, @namnhaphoc2=namnhaphoc FROM lop WHERE malop=@malop2
PRINT @tenlop1+' nhap hoc nam '+str(@namnhaphoc1) print @tenlop2+' nhap hoc nam '+str(@namnhaphoc2)
IF @namnhaphoc1=@namnhaphoc2
PRINT 'Hai lớp nhập học cựng năm' ELSE
PRINT 'Hai lớp nhập học khỏc năm'
5.1.5 Giỏ trị trả về của tham số trong thủ tục lưu trữ
Trong cỏc vớ dụ trước, 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.
Vớ dụ 5.4: Xột cõu lệnh sau đõy
CREATE PROCEDURE sp_Conghaiso(@a INT,@b INT, @c INT) AS
SELECT @c=@a+@b
Nếu sau khi đó tạo thủ tục với cõu lệnh trờn, ta thực thi một tập cỏc cõu lệnh như sau:
SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong SELECT @tong
Cõu lệnh “SELECT @tong” cuối cựng trong loạt cỏc cõu lệnh trờn sẽ cho kết quả là: 0 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
và trong lời gọi thủ tục, sau đối sốđược truyền cho thủ tục, ta cũng phải chỉ định thờm từ khoỏ OUTPUT (hoặc OUT)
Vớ dụ 5.5: Ta định nghĩa lại thủ tục ở vớ dụ 5.4 như sau:
CREATE PROCEDURE sp_Conghaiso(
@a INT,
@b INT,
@c INT OUTPUT) AS
SELECT @c=@a+@b
và thực hiện lời gọi thủ tục trong một tập cỏc cõu lệnh như sau:
DECLARE @tong INT SELECT @tong=0
EXECUTE sp_Conghaiso 100,200,@tong OUTPUT SELECT @tong
thỡ cõu lệnh “SELECT @tong” sẽ cho kết quả là: 300
5.1.6 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
Vớ dụ 5.6: Trong cõu lệnh dưới đõy:
@tenlop NVARCHAR(30)=NULL, @noisinh NVARCHAR(100)='Huế') AS BEGIN IF @tenlop IS NULL SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh
ELSE
SELECT hodem,ten
FROM sinhvien INNER JOIN lop
ON sinhvien.malop=lop.malop WHERE noisinh=@noisinh AND
tenlop=@tenlop END
thủ tục sp_TestDefault được định nghĩa với tham số @tenlop cú giỏ trị mặc định là
NULL và tham số @noisinh cú giỏ trị mặc định là Huế. Với thủ tục được định nghĩa như trờn, ta cú thể thực hiện cỏc lời gọi với cỏc mục đớch khỏc nhau như sau:
• Cho biết họ tờn của cỏc sinh viờn sinh tại Huế:
sp_testdefault
• Cho biết họ tờn của cỏc sinh viờn lớp Tin K24 sinh tại Huế:
sp_testdefault @tenlop='Tin K24'
• Cho biết họ tờn của cỏc sinh viờn sinh tại Nghệ An:
sp_testDefault @noisinh=N'Nghệ An'
• Cho biết họ tờn của cỏc sinh viờn lớp Tin K26 sinh tại Đà Nẵng:
sp_testdefault @tenlop='Tin K26',@noisinh='Đà Nẵng'
5.1.7 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|RECOMPILE,ENCRYPTION] AS
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.
5.1.8 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 đú.
5.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).
Ngoài những hàm do hệ quản trị cơ sở dữ liệu cung cấp sẵn, người sử dụng cú