Trong phạm vi của luận văn tôi xin đưa ra chương trình thử nghiệm trên một CSDL về quản lý hàng hóa. Xây dựng các trigger đảm bảo một số ràng buộc đối với CSDL đó.
3.4.1. Trigger ngăn chặn việc xóa database trên Server.
Với trigger này đƣợc dụng trong phạm vi Server với tên:
tr_01_DontDropDataBase
a. Lệnh tạo (create) và kiểm tra (test) trigger:
/*1.tr_01_DontDropDataBase*/
--Create
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tr_01_DontDropDataBase')
DROP TRIGGER tr_01_DontDropDataBase
ON ALL SERVER;
GO
CREATE TRIGGER tr_01_DontDropDataBase ON ALL SERVER
FOR DROP_DATABASE AS
RAISERROR ('tr_01_DontDropDataBase:Ban khong the xoa DataBase nay.Muon xoa ban
phai disable trigger tr_01_DontDropDataBase !',10, 1) ROLLBACK
GO --Test
DROP Database databaseTest GO
c. Hiển thị thông báo sau khi chạy Test
3.4.2. Trigger ngăn chặn insert vào bảng Product.
a. Mô tả: Với tên: tr_02_Product. Sử dụng trong phạm vi bảng Table Product
- Khi gặp sự kiện Thêm dữ liệu vào bảng Product.
- Với điều kiệnlà Các trường Name, Code, ParentId mới insert vào
bị trùng với record đã tồn tại trong bảng Product.
- Hành động xảy ra là: Không cho phép insert dữ liệu trùng Name, Code, ParentId (rollback lại table, dữ liệu của table vẫn nhƣ cũ)
b. Lệnh tạo và kiểm tra: /*2.tr_02_Product*/
--Create
IF OBJECT_ID('tr_02_Product','TR') IS NOT NULL DROP TRIGGER tr_02_Product;
GO
CREATE TRIGGER tr_02_Product ON Product AFTER INSERT AS
DECLARE
@Name nvarchar(250),
@Code nvarchar(50),
@ParentId bigint
SELECT @Name = inst.Name,
@Code =inst.Code,
@ParentId = inst.ParentId FROM inserted AS inst
IF EXISTS ( SELECT * FROM Product WHERE Name = @Name AND Code = @Code AND ParentId =@ParentId )
BEGIN
RAISERROR ('tr_02_Product:San pham nay da co trong bang, ban khong insert vao duoc nua',16,1)
ROLLBACK TRANSACTION END
GO --Test
SELECT * FROM [Product] WHERE ParentId =16 AND Code = 'updatecode' AND Name = 'updateproduct'
GO
INSERT INTO [ECADataBase].[dbo].[Product]
([Name],[Code],[ParentId],[FlagNew],[FlagDeleted],[Fl agHot])
VALUES ('updateproduct','updatecode',16,1,1,1) c. Hiển thị thông báo sau khi chạy Test.
3.4.3. Trigger ngăn chặn update (cập nhật) bảng Product.
Với tên tr_03_Product. Phạm vi sử dụng trong bảng Table Product.
a. Mô tả
- Event: cập nhật (Update) bảng Product.
- Condition: Giá trị update của CurrentCost nằm ngoài khoảng (10000,2000000)
- Action: Rollback lại dữ liệu, không update dữ liệu mới b. Lệnh tạo và kiểm tra: /*3.tr_03_Product*/
--Create
IF OBJECT_ID('tr_03_Product','TR') IS NOT NULL DROP TRIGGER tr_03_Product;
GO
CREATE TRIGGER tr_03_Product ON Product AFTER UPDATE AS
DECLARE
@CurrentCost bigint
SELECT @CurrentCost = inst.CurrentCost FROM inserted AS inst
IF (@CurrentCost < 10000 OR @CurrentCost > 2000000) BEGIN
IF(@CurrentCost < 10000)
RAISERROR ('tr_03_Product:Ban Update sai.CurrentCost khong the nho hon 10000',16,1)
IF (@CurrentCost > 2000000)
RAISERROR ('tr_03_Product:Ban Update sai.CurrentCost khong the lon hon 2000000',16,1)
ROLLBACK TRANSACTION END
GO --Test
SELECT * FROM Product WHERE Id =1195
Update Product Set CurrentCost =2300000 WHERE Id =1195 3.4.4. Trigger ngăn chặn xóa dữ liệu trong bảng
Tên tr_04_Product. Sử dụng trong phạm vi bảng Table Product a. Mô tả:
- Event: Xóa dữ liệu trong bảng.
- Condition: Record (row) của bảng có trường Amount > 0.
- Action: Rollback lại dữ liệu, không xóa đƣợc record có Amount
>0 b. Lệnh tạo và kiểm tra:
--Create
IF OBJECT_ID('tr_04_Product','TR') IS NOT NULL DROP TRIGGER tr_04_Product;
GO
CREATE TRIGGER tr_04_Product ON Product AFTER DELETE AS
DECLARE
@Amount bigint
SELECT @Amount = inst.Amount FROM deleted AS inst
BEGIN
IF(@Amount > 0)
RAISERROR ('tr_04_Product:San pham van con trong kho.Ban khong the xoa duoc',16,1)
ROLLBACK TRANSACTION END
GO --Test
SELECT * FROM Product WHERE Id =1195 DELETE FROM Product WHERE Id =1195 3.4.5. Trigger ngăn chặn tạo mới record trong bảng.
Tên tr_05_ProductCart. Sử dụng trong phạm vi bảng Table ProductCart a. Mô tả:
- Event: tạo mới record trong bảng.
- Condition:Trường Amount của record này có giá trị lớn hơn trường Amount của record bảng Product mà có cùng ProducId với nhau.
- Action: Rollback lại dữ liệu, không tạo mới đƣợc b. Lệnh tạo và kiểm tra:
--Create
IF OBJECT_ID('tr_05_ProductCart','TR') IS NOT NULL DROP TRIGGER tr_05_ProductCart;
GO
CREATE TRIGGER tr_05_ProductCart ON ProductCart AFTER INSERT
AS
DECLARE
@AmountInProduct INT,
@AmountInProductCart INT,
@ProductId BIGINT
SELECT @AmountInProductCart = Amount,@ProductId = ProductId FROM inserted
SELECT @AmountInProduct = Amount FROM Product WHERE Id = @ProductId
IF (@AmountInProduct < @AmountInProductCart) BEGIN
RAISERROR ('tr_05_ProductCard:Ban ko the tao moi ProductCart.Vi Amount trong table Product <
Amount ma ban muon tao trong table ProductCart',16,1)
ROLLBACK TRANSACTION END
GO --Test
SELECT Id as ProductId,Name,Code,Amount,ParentId FROM Product WHERE Id =1195
INSERT INTO ProductCart (CartId,ProductId,Amount) VALUES (213,1195,1001)
3.4.6. Tạo mới trong bảng ( không vi phạm trigger của trigger 05) Với tên tr_06_ProductCart. Đƣợc sử dụng trong phạm vi bảng Table ProductCart, Product
a. Mô tả:
- Event : tạo mới record trong bảng.
- Condition: không vi phạm condition ở trigger tr_05_ProductCart.
- Action: Cập nhật lại trường Amount trong bảng Product = Amount - giá trị Amount tạo mới của table ProductCart b. Lệnh tạo và kiểm tra: /*6.tr_06_ProductCart*/
--Create
IF OBJECT_ID('tr_06_ProductCart','TR') IS NOT NULL DROP TRIGGER tr_06_ProductCart;
GO
CREATE TRIGGER tr_06_ProductCart ON ProductCart AFTER INSERT
AS
DECLARE
@AmountInProduct INT,
@AmountInProductCart INT,
@ProductId BIGINT
SELECT @AmountInProductCart = Amount,@ProductId = ProductId FROM inserted
SELECT @AmountInProduct = Amount FROM Product WHERE Id = @ProductId
IF (@AmountInProduct > @AmountInProductCart) BEGIN
UPDATE Product
SET Amount = @AmountInProduct -
@AmountInProductCart
WHERE Id = @ProductId
PRINT('tr_06_ProductCart: Da update, giam
Amount= ' +CAST(@AmountInProductCart AS nvarchar(10))+ ' trong Product xuong khi tao moi data trong ProductCart')
END GO
--Test
SELECT Id as ProductId,Name,Code,Amount,ParentId FROM Product WHERE Id =1195
INSERT INTO ProductCart (CartId,ProductId,Amount) VALUES (213,1195,100)
DELETE FROM ProductCart
UPDATE Product SET Amount = 1000 WHERE Id = 1195 3.4.7. Trigger ngăn chặn xóa bảng trong database.
Với tên tr_07_DontDropTable. Sử dụng trong phạm vi bảng Database.
a. Mô tả: Không cho phép xóa table trong cơ sở dữ liệu ECA Database b. Lệnh tạo và kiểm tra: /*7.tr_07_DontDropTable*/
--Create
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tr_07_DontDropTable')
DROP TRIGGER tr_07_DontDropTable ON DATABASE;
GO
CREATE TRIGGER tr_07_DontDropTable ON DATABASE
FOR DROP_TABLE AS
RAISERROR ('tr_07_DontDropTable:Ban khong the xoa table trong co so du lieu duoc.Muon xoa ban
phai disable trigger tr_07_DontDropTable !',10, 1) ROLLBACK
GO --Test
DROP TABLE TableForTest2
3.4.8. Ngăn chặn xóa trigger trong CSDL
Với tên: tr_08_DontDropTrigger. Sử dụng trong phạm vi bảng Database.
a. Mô tả: Không cho phép xóa trigger trong CSDL ECA Database.
b. Lệnh tạo và kiểm tra: /*8.tr_08_DontDropTrigger*/
--Create
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tr_08_DontDropTrigger')
DROP TRIGGER tr_08_DontDropTrigger ON DATABASE;
GO
CREATE TRIGGER tr_08_DontDropTrigger ON DATABASE
FOR DROP_TRIGGER AS
RAISERROR ('tr_08_DontDropTrigger:Ban khong the xoa Trigger trong co so du lieu duoc.Muon xoa ban
phai disable trigger tr_08_DontDropTrigger !',10, 1) ROLLBACK
GO --Test
DROP TRIGGER tr_07_DontDropTable ON DATABASE 3.4.9. Không cho phép tạo mới bảng trong CSDL.
Với tên bảng: tr_09_DontCreateTable. Sử dụng trong phạm vi bảng Database a. Mô tả: Không cho phép tạo mới table trong CSDL ECA DataBase
b. Lệnh tạo và kiểm tra: /*09.tr_09_DontCreateTable*/
--Create
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tr_09_DontCreateTable')
DROP TRIGGER tr_09_DontCreateTable ON DATABASE;
GO
CREATE TRIGGER tr_09_DontCreateTable ON DATABASE
FOR CREATE_TABLE,ALTER_TABLE AS
RAISERROR ('tr_09_DontCreateTable:Ban khong co quyen them table hoac sua chua table !
Muon tao moi table ban phai disable trigger tr_09_DontCreateTable !',16, 1)
ROLLBACK GO
--Test
CREATE TABLE TestCreateTable (OrderID int, CustID int)
3.4.10. Không cho phép tạo mới trigger trong CSDL.
Với tên bảng: tr_10_DontCreateTrigger. Phạm vi sử dụng trong bảng Database.
a. Mô tả: Không cho phép tạo mới trigger trong CSDL
b. Lệnh tạo và kiểm tra: /*10.tr_10_DontCreateTrigger*/
--Create
IF EXISTS (SELECT * FROM sys.triggers WHERE parent_class = 0 AND name = 'tr_10_DontCreateTrigger')
DROP TRIGGER tr_10_DontCreateTrigger ON DATABASE;
GO
CREATE TRIGGER tr_10_DontCreateTrigger ON DATABASE
FOR CREATE_TRIGGER AS
RAISERROR ('tr_10_DontCreateTrigger:Ban khong the tao Trigger moi duoc nua.
Muon tao them trigger ban phai xoa trigger tr_10_DontCreateTrigger !',10, 1)
ROLLBACK GO
--Test
IF EXISTS (SELECT * FROM sys.triggers
WHERE parent_class = 0 AND name = 'triggerForTest') DROP TRIGGER triggerForTest
ON DATABASE;
GO
CREATE TRIGGER triggerForTest ON Product AFTER INSERT
AS
PRINT('Tao moi triggerForTest') GO