Professional Documents
Culture Documents
Co-So-Du-Lieu Tham Khao Trigger
Co-So-Du-Lieu Tham Khao Trigger
1. Table
Sử dụng cú pháp CREATE TABLE để xây dựng 5 bảng theo đúng các yêu cầu sau:
- Bảng khách hàng (Customers) gồm các cột: CustomerID, CompanyName, Phone, Fax,
Address, ContactName. Trong đó quy định CustomerID là khóa chính.
Tên cột Kiểu dữ liệu NULLl hoặc NOT NULL
CustomerID Nchar(5) NOT NULL
CompanyName Nvarchar(40) NOT NULL
Phone Nvarchar(24) NULL
Fax Nvarchar(24) NULL
Address Nvarchar(60) NULL
ContactName Nvarchar(30) NULL
- Bảng nhân viên (Employees) gồm các cột: EmployeeID, LastName, FirstName, BirthDate,
Photo, IDNo, Notes, HireDate. Trong đó quy định EmployeeID là khóa chính và tăng tự
động bắt đầu từ 1, IDNo là duy nhất (Unique).
Tên cột Kiểu dữ liệu NULLl hoặc
NOT NULL
EmployeeID Int IDENTITY (1,1) NOT NULL
LastName Nvarchar(20) NOT NULL
FirstName Nvarchar(14) NOT NULL
BirthDate Datetime NULL
Photo Image NULL
IDNo Nvarchar(10) NOT NULL
Notes Ntext NULL
HireDate Datetime NULL
- Bảng hàng hóa (Products) gồm các cột: ProductID, ProductName, UnitPrice. Trong đó
quy định ProductID là khóa chính, kiểm tra giá trị cột UnitPrice > 0.
Tên cột Kiểu dữ liệu NULLl hoặc
NOT NULL
ProductID Int IDENTITY (1,1) NOT NULL
ProductName Nvarchar(40) NOT NULL
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
- Bảng đơn đặt hàng (Orders) gồm các cột: OrderID, OrderDate, TotalAmount,
CustomerID, EmployeeID. Trong đó quy định OrderID là khóa chính và tự động tăng bắt
đầu từ 10248, giá trị mặc định cho OrderDate là ngày hiện hành, giá trị mặc định cho cột
TotalAmount là 0, CustomerID là khóa ngoại tham chiếu qua bảng Customers,
EmployeeID là khóa ngoại tham chiếu qua bảng Employees.
Tên cột Kiểu dữ liệu NULLl hoặc
NOT NULL
OrderID Int IDENTITY (10248,1) NOT NULL
OrderDate Datetime NULL
TotalAmount Money NOT NULL
CustomerID Nchar(5) NOT NULL
EmployeeID Int NOT NULL
- Bảng chi tiết đặt hàng (OrderDetails) gồm các cột: OrderID, ProductID, UnitPrice,
Quantity. Trong đó quy định OrderID, ProductID là khóa chính, OrderID là khóa ngoại
tham chiếu qua bảng Orders, ProductID là khóa ngoại tham chiếu qua bảng Products, kiểm
tra giá trị cột UnitPrice > 0 và giá trị cột Quantity > 0.
Tên cột Kiểu dữ liệu NULLl hoặc NOT NULL
OrderID Int NOT NULL
ProductID Int NOT NULL
UnitPrice Money NOT NULL
Quantity Smallint NOT NULL
Lưu 5 câu lệnh CREATE TABLE vừa tạo vào một tập tin có phần mở rộng là *.sql để sau
này có thể tạo nhanh lại các bảng.
2. Triggers
2.1 Khái niệm
Trigger là một loại stored procedure được định nghĩa đặc biệt để thực thi một cách tự động
khi có một câu lệnh UPDATE, INSERT hoặc DELETE tác động vào table. Trigger là một
công cụ mạnh, khi dữ liệu bị sửa đổi nó sẽ tự động thực hiện việc ép buộc các giao dịch
ThS. Đỗ Thị Minh Phụng Trang 2
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
sửa đổi này theo các qui tắc đã định (các ràng buộc dữ liệu) nhằm mục đích đảm bảo tính
toàn vẹn dữ liệu.
Các table có thể có nhiều trigger. Câu lệnh CREATE TRIGGER có thể được định nghĩa
với các mệnh đề FOR UPDATE, FOR INSERT, hoặc FOR DELETE.
Các câu lệnh chứa bên trong các trigger không có gì khác với stored procedure.
Các trigger thực thi sau khi các câu lệnh bên trong chúng hoàn thành. Nếu tồn tại câu lệnh
sai với một lỗi, ví dụ như là một lỗi vi phạm ràng buộc hoặc lỗi cú pháp, trigger sẽ không
được thực thi.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
Cú pháp
Ví dụ
Với CSDL đã tạo ban đầu, viết một trigger INSERT trên bảng ORDERS sao cho khi thêm
một dòng dữ liệu vào bảng ORDERS phải kiểm tra các cột khóa ngoại: cột CustomerID trong
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
Bảng INSERTED là một bảng được phát sinh ra tự động trong các trigger loại INSERT
TRIGGER. Bảng này dùng để lưu trữ thông tin của một dòng dữ liệu trước khi được đưa vào bảng
dữ liệu của SQL.
Cú pháp
Ví dụ
Với CSDL đã tạo ban đầu, viết một trigger DELETE trên bảng PRODUCTS sao cho khi
xóa một ProductID thì trigger phải kiểm tra sự tồn tại của các ProductID có liên quan trên bảng
ORDERDETAILS. Khi đó, nếu ProductID có tồn tại trong bảng ORDERDETAILS thì thông báo
không thể xóa được. Ngược lại, thì thông báo đã xóa ProductID đó rồi.
Lưu ý
Bảng DELETED là một bảng được phát sinh ra tự động trong các trigger loại DELETE
TRIGGER. Bảng này dùng để lưu trữ các dòng dữ liệu sẽ bị xóa.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
Thông thường các hành động bên trong biến cố UPDATE dùng để kiểm tra sự tồn tại của
các giá trị khóa ngoại có liên quan.
Để kiểm tra giá trị của một cột có bị thay đổi bên trong biến cố UPDATE, sử dụng hàm
UPDATE với biến cố như sau:
UPDATE (col_name)
9 Trả về True: khi giá trị trên cột bị thay đổi.
9 Trả về False: khi giá trị cột không bị thay đổi.
Cú pháp
Ví dụ
Với CSDL đã tạo ban đầu, viết một trigger trên bảng CUSTOMERS, biết rằng khi thay đổi
CustomerID thì trigger tự động thay đổi trên bảng ORDERS.
UPDATE ORDERS
SET CustomerID = @NewCustomerID
WHERE CustomerID = @OldCustomerID
IF @@ERROR <>0
BEGIN
PRINT 'CustomerID ko thay doi'
ROLLBACK TRAN
END
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
ELSE
PRINT 'CustomerID da thay doi'
END
PRINT 'CustomerID da thay doi'
END
Tăng giá trị cột TotalAmount khi thêm một dòng dữ liệu trên bảng ORDERDETAILS
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
END
IF @Msg='TC'
PRINT 'Da luu thanh cong'
ELSE
BEGIN
PRINT @Msg
ROLLBACK TRAN
END
Giảm giá trị cột TotalAmount khi một dòng dữ liệu trong bảng ORDERDETAILS bị xóa
UPDATE ORDERS
SET TotalAmount = TotalAmount -@Nttg
WHERE OrderID = @nOrderID
Thay đổi giá trị cột TotalAmount khi các cột Quantity, UnitPrice trong bảng ORDERDETAILS bị thay
đổi
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
5. Click Delete.
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
1. Tạo trigger xóa dữ liệu tự động bên bảng con khi dữ liệu bên bảng cha bị xóa.
a. Tạm thời tắt đi các CONSTRAINT trên bảng ORDERDETAILS.
b. Viết 1 trigger DELETE trên bảng ORDERS sao cho khi xóa 1 OrderID thì trigger sẽ tự
động xóa các OrderID có liên quan bên bảng ORDERDETAILS. Khi đó thông báo ra màn
hình bằng lệnh PRINT cho người dùng biết đã xóa bao nhiêu dòng trong bảng
ORDERDETAILS.
c. Sau đó xóa thử OrderID 10249 trong bảng ORDERS và xem kết quả thực hiện.
2. Tạo trigger kiểm tra sự tồn tại dữ liệu bên bảng con khi dữ liệu bên bảng cha bị xóa.
a. Viết 1 trigger DELETE trên bảng PRODUCTS sao cho khi xóa 1 ProductID thì trigger
phải kiểm tra sự tồn tại của các ProductID có liên quan bên bảng ORDERDETAILS. Khi
đó nếu ProductID có tồn tại trong bảng ORDERDETAILS thì thông báo không thể xóa
được. Ngược lại thì thông báo đã xóa ProductID đó rồi.
b. Sau đó lần lượt xóa các ProductID sau: 25 và 70 và xem kết quả thực hiện.
3. Tạo trigger kiểm tra sự tồn tại các khóa ngoại bên bảng cha khi dữ liệu bên bảng con được
thêm vào.
a. Tạm thời tắt đi các CONSTRAINT trên bảng ORDERS.
b. Viết 1 trigger INSERT trên bảng ORDERS sao cho khi thêm 1 dòng dữ liệu vào bảng
ORDERS phải kiểm tra các cột khóa ngoại: cột CustomerID trong bảng CUSTOMERS,
ThS. Đỗ Thị Minh Phụng Trang 12
CuuDuongThanCong.com https://fb.com/tailieudientucntt
Hệ quản trị CSDL SQL Server
CuuDuongThanCong.com https://fb.com/tailieudientucntt