Thu hồi quyền thực thi cỏc cõu lờnh:

Một phần của tài liệu Giáo trình SQL cơ bản cho người mới bắt đầu Đại học khoa học Huế (Trang 103 - 108)

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ươươnngg55 T THỦH TỤTCC LƯUU TTRR,,HHÀÀMM VVÀÀ TTRRIIGGGGEERR 5.1 Th tc 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 (adsbygoogle = window.adsbygoogle || []).push({});

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 (adsbygoogle = window.adsbygoogle || []).push({});

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'

Một phần của tài liệu Giáo trình SQL cơ bản cho người mới bắt đầu Đại học khoa học Huế (Trang 103 - 108)