View: là một bảng đơn được tạo ra từ các
bảng cơ sở hoặc từ các view được tạo trước 
– View không tồn tại vật lý vì vậy view còn gọi là
bảng ảo.
– Đơn giản hoá việc truy cập dữ liệu
– Chọn dữ liệu cần thiết ứng với mổi user, đảm bảo
an toàn dữ liệu
– Dùng để Import và export
– View là một đối tượng của CSDL
                
              
                                            
                                
            
                       
            
                 97 trang
97 trang | 
Chia sẻ: lylyngoc | Lượt xem: 3854 | Lượt tải: 1 
              
            Bạn đang xem trước 20 trang tài liệu Chương 9: Views & Lập trình trong SQL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Chương 9 
Views & Lập trình trong SQL 
1 
Views (virtual tables) trong SQL 
• View: là một bảng đơn được tạo ra từ các 
bảng cơ sở hoặc từ các view được tạo trước 
– View không tồn tại vật lý vì vậy view còn gọi là 
bảng ảo. 
– Đơn giản hoá việc truy cập dữ liệu 
– Chọn dữ liệu cần thiết ứng với mổi user, đảm bảo 
an toàn dữ liệu 
– Dùng để Import và export 
– View là một đối tượng của CSDL 
Views (virtual tables) trong SQL 
• Cú pháp tạo view: 
Ví dụ: 
CREATE VIEW view_name [(column[ ,...n ])] 
AS select_statement [ WITH CHECK OPTION ] 
CREATE VIEW WORKS_ON1 
AS SELECT FNAME, LNAME, PNAME, HOURS 
FROM EMPLOYEE, PROJECT, WORKS_ON 
WHERE SSN=ESSN AND PNO=PNUMBER; 
Views (virtual tables) trong SQL 
Ví dụ: 
CREATE VIEW DEPTJNFO 
 (DEPT_NAME,NO_OF_EMPS,TOTAL_SAL) 
AS SELECT DNAME, COUNT (*), SUM (SALARY) 
FROM DEPARTMENT, EMPLOYEE 
WHERE DNUMBER=DNO 
GROUP BY DNAME; 
Views (virtual tables) trong SQL 
Ví dụ: 
CREATE TABLE WORKS_ON_NEW AS 
 SELECT FNAME, LNAME, PNAME, HOURS 
 FROM EMPLOYEE, PROJECT, WORKS_ON 
 WHERE SSN=ESSN AND PNO=PNUMBER 
 GROUP BY PNAME; 
Views (virtual tables) trong SQL 
• Câu lệnh select trong view không được 
chứa: 
– Mệnh đề ORDER BY 
– Mệnh đề COMPUTE VÀ COMPUTE BY 
– Các bảng tạm không được tham chiếu trong 
view không dùng select Into trong view 
– Các trigger và chỉ mục không được tạo ra trên 
view 
6 
Views (virtual tables) trong SQL 
• DELETE VIEW: 
 DROP VIEW view_name 
• RENAME Views: 
sp_rename old_viewname, new_viewname 
• CHECK VIEW: 
 sp_helptext viewname 
• MODIFY VIEW : 
 ALTER VIEW view_name (column_list) 
 AS select_statement 
Lập trình trong SQL 
• Lập trình CSDL: Giao tiếp với chương trình 
ứng dụng 
– Chương trình bao gồm: Biến (variable), câu lệnh 
SQL và cấu trúc điều khiển. 
• Các khái niệm cơ bản: 
– Định danh (Identifiers) 
– Batch (tập các câu lệnh T-SQL liên tiếp kết thúc 
bằng lệnh GO) 
– Script 
Lập trình trong SQL 
• Kiểu dữ liệu: Có 2 loại 
– Kiểu dữ liệu của hệ thống (System - supplied data 
type) 
– Kiểu dữ liệu do người dùng định nghĩa (User- 
defined data type) 
• Reference to object: 
Server.database.owner.object 
Biến 
• Biến cục bộ (Local variable) 
– Cú pháp khai báo: 
– Ví dụ: DECLARE @EmpIDVar int 
DECLARE@ VariableName var_type 
Biến 
– Gán giá trị cho biến: Khi một biến được khai báo thì 
giá trị của nó là Null 
– Ví dụ 1: 
DECLARE @temp_name varchar(20) 
SELECT @temp_name = companyname 
FROM customers 
WHERE customerid = ‘adsff’ 
SET @VariableName = expression 
or 
SELECT{@VariableName=expression} [,…n] 
Biến 
– Ví dụ 2: 
DECLARE @temp_city varchar(10) 
 SET @temp_city = ‘london’ 
 SELECT * FROM Customers 
 WHERE city = @temp_city 
Biến 
– Ví dụ 3: 
 DECLARE @temp_CustID Char(5), @temp_name varchar(50) 
SET @temp_CustID = ‘ALFKI’ 
SELECT @temp_name = CompanyName FROM Customers 
Where CustomerID = @temp_CustID 
PRINT ‘CustomerID is ‘ + @temp_CustID + ‘ and Name is ‘+ 
@temp_name 
Biến 
• Biến toàn cục (Global Variables): là một hàm 
hệ thống. 
– Giá trị trả về của hàm được hiển thị bởi câu lệnh 
SELECT @@Variablename. 
– Không gán giá trị cho biến toàn cục. 
– Biến toàn cục không có kiểu 
– Tên biến được bắt đầu với @@. 
Biến 
• Một số biến toàn cục thông dụng 
– @@SERVERNAME: trả về tên của server 
– @@ROWCOUNT: số dòng chịu tác dụng của câu 
lệnh cuối cùng. 
– @@ERROR: trả về chỉ số index của lỗi 
– @@IDENTITY: trả về định danh . 
Biến 
Ví dụ: 
Update Employees set LastName = ‘Brooke’ 
Where LastName =‘Brook’ 
If(@@rowcount =0) 
 begin 
 print ‘No rows were updated’ 
 return 
 end 
Cách thực thi câu lệnh SQL 
• Cú pháp: 
Example: 
DECLARE @vname varchar(20), @table varchar(20), 
@vdbase varchar(20) 
SET @vname="'White'" 
SET @table='authors' 
SET @vdbase='pub' 
EXECUTE ('USE'+@vdbase + 'SELECT * FROM '+ @ vtable 
+ 'WHERE au_lastname=‘+@vname) 
EXEC [USE] ({@string_variable| [ N ] 'tsql_string'} 
[+ ...n ] ) 
Cách thực thi câu lệnh SQL 
• Batches: là một tập các câu lệnh SQL gửi đến 
server và được thực thi tại cùng một thời 
điểm. 
– Nếu một câu lệnh trong batch bị lỗi thì SQL server 
sẽ không thực thi tất cả những câu lệnh trong 
batches. 
– Mỗi batch không thể chứa tất cả những câu lệnh 
sau: CREATE PROCEDURE, CREATE TRIGGER, 
CREATE VIEW, CREATE RULE, CREATE DEFAULT. 
Cách thực thi câu lệnh SQL 
Ví dụ: 
go 
use master 
if exists(select * from sysdatabases where name like 
'sales') 
drop database sales 
go 
create database sales 
on 
( name = sales_data, filename ='e:\sales_data.mdf', size 
= 1, maxsize = 5, filegrowth =1) 
log on 
( name = sales_log, filename ='e:\sales_log.ldf', size = 1, 
maxsize = 2, filegrowth =1) 
Cách thực thi câu lệnh SQL 
• Transact-SQL Scripts: 
– Script là một tập các câu lệnh T-SQL được lưu trữ 
trong một file với một hoặc nhiều batchs. 
• Transactions: là một đơn vị công việc với 4 đặc 
điểm sau: 
– Atomic (nguyên tố) 
– Consistent (nhất quán) 
– Isolated (cô lập) 
– Durable (bền) 
Cách thực thi câu lệnh SQL 
• Cấu trúc của Transaction: 
BEGIN TRANSACTION [] 
 [WITH MARK ]… 
… 
[SAVE TRANSACTION ]… 
… 
ROLLBACK TRANSACTION [ | 
 ] 
COMMIT TRANSACTION 
Cách thực thi câu lệnh SQL 
Ví dụ: 
BEGIN TRAN 
UPDATE authors 
SET city=‘San Jose’ Where au_lname=‘smith’ 
INSERT titles 
VALUES(‘BU1122’,’Teach Yourself SQL’,’business’, 
‘9988’, $35.00, $1000,10,4501,’a great book’) 
SELECT *from titleauthor 
COMMIT TRAN 
Cách thực thi câu lệnh SQL 
• Ví dụ: 
BEGIN TRAN 
DELETE Sales where titles_id =‘BU1032’ 
if @@ERROR >0 
ROLLBACK TRAN (huỷ hoàn toàn giao tác) 
else 
COMMIT TRAN 
Cấu trúc điều khiển 
• IF … ELSE 
IF boolean_expression 
 {sql_statement | statement_block} 
[ELSE boolean_expression 
 {sql_statement | statement_block}] 
Cấu trúc điều khiển 
• BEGIN …END 
BEGIN 
 {sql_statement | statement_ block} 
END 
Cấu trúc điều khiển 
• Ví dụ: 
IF ( SELECT COUNT(*) FROM authors 
 WHERE contract =0) >0 
BEGIN 
 PRINT 'These authors do not have contracts on file: ' 
 SELECT au_lname, au_fname, au_id 
 FROM authors 
 WHERE contract=0 
END 
ELSE 
BEGIN 
 PRINT 'All authors have contracts on file.' 
END 
Cấu trúc điều khiển 
• WHILE 
WHILE boolean_expression 
 {sql_statement | statement_block} 
 [BREAK] 
 {sql_statement | statement_block} 
 [CONTINUE] 
Cấu trúc điều khiển 
Ví dụ 1: 
DECLARE @counter INT 
SET @counter=0 
WHILE (@counter<20) 
BEGIN 
 INSERT INTO Pubs..paractice 
 VALUES ('last'+CAST(@counter as char(2)), 'First') 
 SET @counter=@counter+1 
END 
Cấu trúc điều khiển 
Ví dụ 2: 
WHILE (SELECT AVG(price) FROM titles) < $30 
BEGIN 
UPDATE titles SET price = price * 2 
SELECT MAX(price) FROM titles 
IF (SELECT MAX(price) FROM titles) > $50 
 BREAK 
ELSE 
 CONTINUE 
END 
PRINT 'Too much for the market to bear' 
Cấu trúc điều khiển 
• CASE 
– Cú pháp CASE đơn giản 
CASE input_expression 
 WHEN when_expression THEN result_expression [ ...n ] 
 [ELSE else_result_expression ] 
END 
Cấu trúc điều khiển 
– Cú pháp CASE đầy đủ: 
CASE 
 WHEN Boolean_expression THEN 
 result_expression [ ...n ] 
 [ ELSE else_result_expression ] 
END 
Cấu trúc điều khiển 
Ví dụ: 
SELECT Category = 
CASE type 
 WHEN 'popular_comp' THEN 'Popular Computing' 
 WHEN 'mod_cook' THEN 'Modern Cooking' 
 WHEN 'business' THEN 'Business' 
 WHEN 'psychology' THEN 'Psychology' 
 WHEN 'trad_cook' THEN 'Traditional Cooking 
 ELSE 'Not yet categorized‘ 
END 
CAST(title AS varchar(25)) AS 'Shortened Title', 
price AS Price FROM titles WHERE price IS NOT NULL 
ORDER BY type, price COMPUTE AVG(price) BY type 
Cấu trúc điều khiển 
Ví dụ: 
SELECT ProductID, Quantity, UnitPrice, [discount%]= 
 CASE 
 WHEN Quantity <=5 THEN 0.05 
 WHEN Quantity BETWEEN 6 and 10 THEN 0.07 
 WHEN Quantity BETWEEN 11 and 20 THEN 0.09 
 ELSE 
 0.1 
 END 
FROM [Order Details] 
ORDER BY Quantity, ProductId 
Cấu trúc điều khiển 
• PRINT: Hiển thị kết quả câu lệnh SQL 
• RETURN 
• WAITFOR 
PRINT ‘any ACII Text’|@local_variable| 
@@FUNTION| String_expr 
RETURN [integer_expression] 
integer_expression : return value 
WAITFOR { DELAY 'time' | TIME 'time' } 
Cấu trúc điều khiển 
Ví dụ: 
BEGIN 
 WAITFOR TIME '22:20' 
 EXECUTE update_all_stats 
END 
Cấu trúc điều khiển 
• RAISERROR 
RAISERROR({msg_id | msg_str} 
{ , severity , state } 
[ , argument [ ,...n ] ] ) 
[ WITH option [ ,...n ] ] 
Thủ tục (Stored Procedures) 
và Hàm (Function) 
Giới thiệu 
• Stored procedure (SP): là một đoạn mã chứa 
các khái báo hoặc các câu lệnh SQL. 
– Stored procedure được lưu trữ trong danh mục 
CSDL server và nó có thể được gọi từ trigger, một 
thủ tục khác hoặc một ứng dụng phía client. 
– Stored procedures có thể được tạo trong CSDL và 
tái sử dụng. 
– Thủ tục nhận tham số đầu vào và trả về một kết 
quả. 
Loại Stored procedures 
• System SP (sp): được lưu trữ trong CSDL Master, 
nhưng có thể thực thi ở bất kỳ CSDL nào. 
– sp_helptext: In nội dung của rule, a default, an 
unencrypted stored procedure, user-defined function, 
trigger, computed column, or view. 
 Example : master.dbo.sp_helptext 
– sp_help: Xuất thông tin về một đối tượng của CSDL. 
– sp_depends: Hiển thị thông tin về đối tượng của CSDL 
phụ thuộc vào view(s), trigger(s), và procedure(s) 
trong CSDL. 
Loại Stored procedures 
Extended SP (xp): được tạo từ ngôn ngữ khác 
(C++,...) và được sử dụng như một thủ tục của SQL 
Server 
 User_defined : 
‒Local sp: là đối tượng trong CSDL dùng để 
thực thi các tác vụ, có thể tạo trong CSDL 
master. 
‒Temporary sp: local (tên bắt đầu với #) và 
global (tên bắt đầu với ##). 
Tạo stored procedures 
• Cú pháp: 
CREATE PROC [EDURE ] procedure_name 
[ ; number ] [ { @parameter data_type } 
[ VARYING ] [ = default ] [ OUTPUT ] ] [,...n ] 
[ WITH { RECOMPILE | ENCRYPTION | 
RECOMPILE, ENCRYPTION } ] 
[FOR REPLICATION ] 
AS sql_statement [ ...n ] 
Tạo stored procedures 
Ví dụ: 
CREATE PROCEDURE OrderSummary 
AS 
SELECT Ord.EmployeeID, 
SummSales=SUM(OrDet.UnitPrice*OrDet.Quantity
) 
FROM Orders AS Ord JOIN [Order Details] AS 
OrDet ON (Ord.OrderID = OrDet.OrderID) 
GROUP BY Ord.EmployeeID 
Thực thi stored Procedures 
• Execute: Dùng để thực thi 
– User-defined function. 
– System procedure. 
– User-defined stored procedure, 
– Extended stored procedure. 
Thực thi stored Procedures 
• Cú pháp: 
44 
[ [ EXEC [ UTE ] ] {[ @return_status = ] 
 { procedure_name [ ;number ] | 
 @procedure_name_var 
 } 
 [ [ @parameter = ] { value | @variable [ 
 OUTPUT ] | [ DEFAULT ] ] [,...n ] 
 [ WITH RECOMPILE ] 
Thực thi stored Procedures 
– Hoặc: 
 Ví dụ: 
EXECUTE dbo.overdueOrders 
EXECUTE ProductName [ ; number ] 
 [[, …n][ OUTPUT ]] 
Hiệu chỉnh stored Procedures 
• Cú pháp: 
ALTER PROC[EDURE] procedure_name 
[WITH option] 
AS 
 sql_statement [...n] 
Hiệu chỉnh stored Procedures 
Ví dụ: 
ALTER PROC dbo.overdueOrders 
AS 
SELECT CONVERT(CHAR(8), RequiredDate,1) RequiredDate, 
CONVERT(CHAR(8), orderDate,1) orderDate, orderId, 
Customerid, EmployeeID 
FROM dbo.orders 
WHERE RequiredDate<GETDATE()and shippeddate is null 
ORDER BY RequiredDate 
Xóa stored Procedures 
• Cú pháp: 
DROP PROC owner.stored_procedure_name 
Tham số trong stored Procedures 
• Input parameter: 
CREATE PROCEDURE procedure_name 
[@parameter_name data_type] [=default_value] 
[WITH option] 
AS 
sql_statement [...n] 
Tham số trong stored Procedures 
Ví dụ1: 
 CREATE PROC dbo.MovieByRating 
 @rating varchar(5) = NULL 
 AS 
 SELECT rating , title 
 FROM movie 
 WHERE rating = @rating 
 ORDER BY title 
Tham số trong stored Procedures 
Ví dụ 2: 
CREATE PROC sp_name 
 @parameter data_type =value 
 AS 
 IF @parameter IS NULL 
 BEGIN 
 PRINT ‘Message Line 1’ 
 PRINT ‘Message Line 2’ 
 RETURN 
 END 
 SELECT statement 
 GO 
51 
Viết thủ tục có tham số a, b dạng input để giải phương 
trình bậc nhất ax+b=0. 
 create proc ptbn @a int,@b int 
 as 
 if(@a=0) print 'Phuong trinh vo nghiem.' 
 else 
 print 'phuong trinh co nghiem la:‘ 
 +cast(cast(-@b as float)/@a as nvarchar(12)) 
 go 
declare @a int 
declare @b int 
set @a=0 
set @b=6 
exec ptbn @a,@b 
Tham số trong stored Procedures 
• Output parameter: 
CREATE PROCEDURE procedure_name 
[@parameter_name data_type] [=default_value] 
OUTPUT 
[WITH option] 
AS 
sql_statement [...n] 
Tham số trong stored Procedures 
Ví dụ: 
CREATE PROC count_row 
 @movie_count int OUTPUT 
 AS 
SELECT @movie_count = COUNT(*) FROM Movie 
GO 
• Sp execution with output parameter: a variable must 
be declared to stored the return value of the output 
parameter 
 DECLARE @num int 
 EXEC count_row @num OUTPUT 
 SELECT @num 
Quản lý lỗi 
• sp_addmessage: Lưu thông báo lỗi mới do 
người dùng định nghĩa trong một thể hiện của 
Database Engine 
– Thông báo lỗi có thể được xem bằng 
sys.messages. 
• Cú pháp: sp_addmessage [ @msgnum= ] msg_id , [ 
@severity= ] severity , [ @msgtext= ] 'msg' 
 [ , [ @lang= ] 'language' ] 
 [ , [ @with_log= ] { 'TRUE' | 'FALSE' } ] 
 [ , [ @replace= ] 'replace' ] 
Quản lý lỗi 
Ví dụ: Create an error message by sp_addmessage 
EXEC sp_addmessage 
@msgnum = 50001, 
@severity = 10, 
@msgtext=‘Cannot delete customer. Customer has 
orders .’, 
@withlog = ‘true’ 
GO 
Quản lý lỗi 
Example: Display an error message when delete a customer 
 CREATE PROC DeleteCust 
 @cust_num nvarchar(5) = null 
 AS 
IF EXISTS (SELECT customerID FROM Orders 
WHERE customerID like @cust_num) 
 BEGIN 
 RAISERROR (50001, 10, 1) 
 RETURN 
 END 
 DELETE FROM Customers 
 WHERE customerID like @cust_num 
 GO 
Quản lý lỗi 
• @@ERROR: trả về số của lỗi nếu lệnh trước 
đó gặp lỗi 
Ví dụ: 
USE AdventureWorks2008R2; 
GO 
UPDATE HumanResources.EmployeePayHistory 
 SET PayFrequency = 4 
 WHERE BusinessEntityID = 1; 
IF @@ERROR = 547 
 PRINT N'A check constraint violation occurred.'; 
GO 
Quản lý lỗi 
• @@ERROR và @@ROWCOUNT: sử dụng để 
xác nhận tính hợp lệ của câu lệnh UPDATE. 
– Giá trị của @@ERROR được kiểm tra cho bất kỳ 
dấu hiệu của một lỗi. 
– Giá trị của @@ROWCOUNT được sử dụng để 
chắc chắn lệnh cập nhật thành công vào các dòng 
trong bảng. 
Hàm (FUNCTION) 
• Hàm hệ thống (System function): 
 aggregate funtion: avg(), count(), count(*), 
sum(), max(), min(),... 
 Other function: getdate(), month(), upper(), 
user_name(),@@rowcount,... 
• Hàm do người dùng định nghĩa (User-defined 
function): 
Cho phép định nghĩa một hàm T-SQL mà nó có thể 
chấp nhận một hoặc nhiều tham số và trả về một 
giá trị đơn hoặc một bảng giá trị. 
Hàm (FUNCTION) 
• Có 3 loại hàm do người dùng định nghĩa: 
– Scalar: trả về một giá trị đơn dựa trên giá trị đầu 
vào. 
– Multi-statement Table-valued: trả về một tập các 
dòng. 
– Inline Table-valued: trả về một tập các dòng. 
Hàm (FUNCTION) 
• Scalar function: 
CREATE FUNCTION [ owner_name. ] function_name 
( [ { @parameter_name [AS] scalar_parameter_data_type 
[= default ] } [ ,...n ] ] ) 
RETURNS scalar_return_data_type. 
[WITH [ [,] ...n] ] 
[AS ] 
 BEGIN 
 function_body 
 RETURN scalar_expression 
END 
Hàm (FUNCTION) 
Ví dụ: 
CREATE FUNCTION dbo.OrderNum (@monthOrd tinyint ) 
RETURNS tinyint 
AS 
BEGIN 
 DECLARE @Ordnum tinyint 
 SELECT @Ordnum = count(orderid) 
 FROM Orders 
 WHERE month(orderdate)= @monthOrd 
 RETURN @Ordnum 
END 
GO 
Hàm (FUNCTION) 
• Thực thi hàm: 
SELECT dbo.OrderNum(7) 
– Hoặc dùng trong mệnh đề Where 
Select orderid 
from orders 
Where dbo.OrderNum(7)>50 and month(orderdate)=7 
Hàm (FUNCTION) 
Table-valued Functions 
 CREATE FUNCTION [ owner_name. ] function_name 
 ([{ @parameter_name 
 [AS] scalar_parameter_data_type [= default ] } [,...n ] ]) 
RETURNS TABLE 
 [WITH [ [,] ...n ] ] 
 [AS ] 
 RETURN [(] select-stmt [)] 
Hàm (FUNCTION) 
Ví dụ: 
CREATE FUNCTION SalesByCategory(@Categoryid Int) 
RETURNS TABLE 
AS 
RETURN 
 (SELECT c.CategoryName, P. ProductName, 
 SUM(Quantity) AS TotalQty 
 FROM Categories c 
 INNER JOIN Products p ON c.CategoryID= p. 
 CategoryID 
 INNER JOIN [Order Details] od ON p.ProductID = 
 od.ProductID 
 WHERE c.CategoryID= @Categoryid 
 GROUP BY c. CategoryName,p.ProductName) 
Hàm (FUNCTION) 
• Multistatement Table-valuesd 
CREATE FUNCTION [owner_name.]function_name 
([{@parameter_name [AS] data_type [=default]} [ ,…n ]]) 
RETURNS @return_variable 
TABLE ({column_definition | table_constraint} [ ,…n ]) 
[WITH { ENCRYPTION | SCHEMABINDING } [ [,] ...n] ] 
[AS] 
BEGIN 
function_body 
RETURN 
END 
Ví dụ: 
CREATE FUNCTION Contacts(@suppliers bit=0) 
RETURNS @Contacts TABLE (ContactName nvarchar(30), Phone 
nvarchar(24), ContactType nvarchar(15)) 
AS 
BEGIN 
INSERT @Contacts 
SELECT ContactName, Phone, 'Customer' FROM Customers 
INSERT @Contacts 
SELECT FirstName + ' ' + LastName, HomePhone, 'Employee' 
FROM Employees 
IF @Suppliers=1 
INSERT @Contacts 
SELECT ContactName, Phone, 'Supplier‘ 
FROM Suppliers 
RETURN 
END 
Hàm (FUNCTION) 
• Thực thi: 
SELECT * FROM CONTACTS(1) ORDER BY 
ContactName 
TRIGGERS-CURSOR 
Trigger 
• Trigger là một loại thủ tục đặc biệt, tự động 
thực thi khi một sự kiện xãy ra trong database 
server. 
• DML triggers: thực thi khi người dùng cố hiệu 
chỉnh dữ liệu thông qua một sự kiện ngôn ngữ 
thao tac dữ liệu (DML). 
• DML events gồm: các câu lệnh INSERT, 
UPDATE, or DELETE trên bảng hoặc view 
Tạo trigger 
• Cú pháp: 
CREATE TRIGGER [ schema_name . ]trigger_name 
ON { table | view } 
[ WITH ENCRYPTION ] 
{ 
 { { FOR | AFTER | INSTEAD OF } 
 { [DELETE] [,] [ INSERT ] [, ] [ UPDATE ] } 
 [ WITH APPEND ] 
 [ NOT FOR REPLICATION ] 
 AS 
 sql_statement [ ...n ] 
 } 
} 
Tạo trigger 
– Schema_name: tên của lược đồ chứa trigger. 
– Table | view: tên bảng hoặc View mà trên đó 
trigger thực thi. 
– WITH ENCRYPTION: mã hóa trigger. 
– FOR | AFTER | INSTEAD OF: loại trigger 
Tạo trigger 
• AFTER triggers hoặc FOR trigger : 
– Thực thi sau khi thực hiện insert/ delete các dòng 
trong table, gọi là reactive, chỉ tạo trên table. 
– Khi tạo trigger nếu không chỉ định rõ thì mặc định 
là AFTER Trigger 
74 
Tạo trigger 
• INSTEAD OF triggers: kiểm tra trứơc khi thực 
hiện Insert/Delete, gọi là proactive, tạo trên 
table và view. 
– Table1 có trigger1, table2 có trigger2, nếu thao 
tác trên table1 có liên quan đến table2 thì 
trigger2 tự động thực thi, gọi là trigger lồng 
(Nested Trigger) 
Tạo trigger 
76 
For/After Instead of 
- Chỉ áp dụng cho table - áp dụng cho table, view 
- Có thể định nghĩa nhiều 
trigger trên một hành động 
I/U/ D 
- Chỉ định nghĩa một Trigger 
trên một hành động I/U/D 
Thực thi sau khi : 
 + xử lý ràng buộc 
 + thực hiện xong hành 
động I/U/D phát sinh trigger 
- Thi hành trước khi: 
 + Xử lý ràng buộc 
 + Thay thế hành động 
phát sinh trigger 
- Không xây dựng được trên 
table có áp dụng cascade 
delete/ update 
Tạo trigger 
– {[DELETE] [ , ] [INSERT] [ , ] [UPDATE] }: chỉ định 
thao tác mà khi thực hiện thì trigger tự động thực 
thi 
• Khi Insert mẫu tin mới vào Table thì mẫu tin mới 
đó cũng lưu trong table INSERTED 
• Khi Delete mẫu tin trong table: Thì các mẫu tin bị 
xoá đó được di chuyển sang table DELETED. 
• Khi Update mẫu tin trong table: thì table đó và 
table INSERTED đều chứa mẫu tin có nội dung 
mới, còn DELETED chứa mẫu tin có nội dung cũ. 
Tạo trigger 
– WITH APPEND 
• Chỉ định thêm một trigger 
• WITH APPEND không được dùng với INSTEAD OF 
triggers. 
– NOT FOR REPLICATION 
• Trigger sẽ không thực hiện khi bảng có liên quan 
đến kỹ thuật sao chép nhân bản (relication) 
• sql_statement: câu lệnh SQL chứa điều kiện và hành 
động của triiger. 
Tạo trigger 
Ví dụ: tạo một trigger hiển thị số dòng được chèn vào 
bảng Nhomsach 
CREATE TRIGGER Thongbaomautin 
ON NHOMSACH FOR INSERT 
AS 
RAISERROR('Có %D mau tin duoc chen'