CÁC TRIGGER TRONG CSDL

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Nghiên cứu, xây dựng cơ sở dữ liệu tích hợp (Trang 65 - 77)

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

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Nghiên cứu, xây dựng cơ sở dữ liệu tích hợp (Trang 65 - 77)

Tải bản đầy đủ (PDF)

(78 trang)