Tải bản đầy đủ (.ppt) (20 trang)

Bài 10 trigger trong SQL và ứng dụng của triger

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (123.59 KB, 20 trang )

Bài 10: Trigger
• Khái niệm về trigger
• Trigger DDL
• Trigger DML

1


Khái niệm về trigger
- Trigger là một kiểu thủ tục được kích họat tự
động theo các sự kiện (events).
- Có 02 lọai triggers:
+ Data Modification Language –DML (For |


After triggers, Instead-of triggers)
+ DDL triggers (For | After triggers)

2


Data Definition Language (DDL) Trigger
Cú pháp:
CREATE TRIGGER trigger_name ON { ALL SERVER | DATABASE } [ WITH
[ ENCRYPTION ] | [ EXECUTE AS CALLER | SELF | 'user_login' ] { FOR |
AFTER } { event_type | event_group } [ ,...n ] AS { sql_statement [ ; ] [ ...n ] }


Execute As Caller là option mặc định.
Execute As User = 'user'
Cú pháp: DROP TRIGGER trigger_name [ ,...n ] ON { DATABASE | ALL
SERVER }
DISABLE TRIGGER { [ schema . ] trigger_name [ ,...n ] | ALL } ON {DATABASE
| ALL SERVER } [ ; ]

DDL triggers là các triggers được tự động gọi sau khi máy thực hiện
các lệnh sau:
Create Table, Drop Table, Alter Procedure, Drop Schema, Create
Login, … (Xem BOL:DDL triggers, events used for firing)
3



Data Definition Language (DDL) Trigger
Tạo trigger sau để tự động thơng báo lỗi mỗi khi có sự kiện: xóa, sửa, thêm bảng
use Test1
go
CREATE TRIGGER trgPreventTableChanges
ON DATABASE
FOR DROP_TABLE, ALTER_TABLE, CREATE_TABLE
AS
RAISERROR('This database contains sensitive data. Changes to the
tables are typically not allowed and are rolled back by a trigger.

If you do have a permission to change tables,temporarily disablethe trigger by using: DISABLE
TRIGGER trdPreventTableChanges ON DATABASE <your batch with table changes>
ENABLE TRIGGER trdPreventTableChanges ON DATABASE;', 16, 1)

ROLLBACK;
GO
go
drop trigger trgPreventTableChanges on database
go
use master
go
drop database Test1

4


Trigger trên server

5


Trigger ngăn cấm việc tạo userlogin
Create Database ServerLog go
use ServerLog go
create table [ActivityLog]([Activity] nvarchar(100),[LogDate] datetime,[UserName]

varchar(100))
Go Truncate table [ActivityLog] go
CREATE TRIGGER trgPreventLoginCreation
ON ALL SERVER FOR CREATE_LOGIN
AS
Rollback
Begin Tran Save_to_data_log
INSERT INTO ServerLog.[dbo].[ActivityLog]([Activity],[LogDate],[UserName])
VALUES ('LOGIN CHANGE', GetDate(), SYSTEM_USER) --SYSTEM_USER chinh
la userLogin

Commit tran Save_to_data_log

RAISERROR('Co loi: It is not allowed to add logins to this server
without permission. Call DBA Security Group.', 16, 1)
GO
drop trigger trgPreventLoginCreation on all server
select * from ServerLog.[dbo].[ActivityLog]

6


Ngăn cấm thay đổi loginUser
-- Ngan cam can thiep den loginUser(CREATE_LOGIN,


DROP_LOGIN, ALTER_LOGIN)
-- ALL SERVER - chỉ định ràng trigger này họat động trong tất cả các
CSDL của server hiện thời
CREATE TRIGGER trgPreventLoginChanges ON ALL SERVER
FOR DDL_LOGIN_EVENTS
AS
RAISERROR('It is not allowed to add logins to this server without
permission.
Call DBA Security Group.', 16, 1)

Rollback
GO

drop trigger trgPreventLoginChanges ON ALL SERVER
7


Event Data Trigger
-- Cho phép ghi lại những sự thay đổi về dữ liệu
Create database Test go
Use Test go
Create table [ActivityLog]( [Activity] varchar(100), [LogDate] datetime ,
[UserName] varchar(50), [Note] varchar(max))
go
CREATE TRIGGER trgAuditTableChanges ON DATABASE

FOR DDL_TABLE_EVENTS AS
Declare @event varchar(max)
Set @event = Convert(nvarchar(max), EVENTDATA())
INSERT INTO [dbo].[ActivityLog] ( [Activity] , [LogDate] , [UserName] ,
[Note] )
VALUES ('TABLE CHANGE', GetDate(),SYSTEM_USER, @event)
go
Create table t1(f1 int)
Select * from [ActivityLog]
go
Use master
Drop database Test go


8


Execute As
• Tự thực hành với các tham số khác nhau của Execute As

(xem lại bài về Procedure)

9



DML Triggers
• Cú Pháp:
-Tạo CREATE TRIGGER <trigger_name> ON <table_name>|
<view_name>
[With encryption|EXECUTE AS { CALLER | SELF | 'user_name' } ]
{[FOR| AFTER] [insert],[update],[delete] | Instead of}
AS Transact-SQL statements
- Xoá Drop Trigger <trg_name>
- DISABLE TRIGGER { trigger_name [ ,...n ] | ALL } ON
object_name
ON: Chỉ ra rằng Trigger đang được viết cho bảng hoặc view nào.
With encryption: nội dung của trigger sẽ được mã hóa.


10


Các dạng họat động của DML trigger
• AFTER (FOR): các câu lệnh bên trong trigger sẽ được
thực hiện sau khi các sự kiện tạo nên trigger đã xảy ra rồi.
• INSTEAD OF: sẽ bỏ qua sự kiện đã kích hoạt trigger mà
thay vào đó sẽ thực hiện các dịng lệnh SQL bên trong
Trigger
Ví dụ: ta có một Update trigger trên một table với câu
INSTEAD OF: Khi đó nếu ta thực hiện việc update dữ

liệu trong bảng thì thay vì update dữ liệu, SQL Server sẽ
thực hiện các lệnh đã được viết sẵn bên trong trigger.

11


Chú ý
- Trigger không thể được tạo ra trên bảng tạm thời hay bảng hệ thống.
Trigger chỉ có thể được kích hoạt một cách tự động bởi một trong
các event Insert, Update, Delete mà khơng thể chạy manually được.
Có thể áp dụng trigger cho View.
- Trigger Insert: Trigger được phát biểu bởi for insert. Trigger này sẽ

được thực hiện khi tiến hành thêm một mẫu tin vào bảng. Mẫu tin
cần thêm sẽ được lưu trong một bảng tạm có tên là Inserted.
- Trigger Delete: Trigger được phát biểu bởi for delete. Trigger này sẽ
được thực hiện khi tiến hành xóa một mẫu tin trong bảng. Mẫu tin
bị xóa sẽ được lưu trong một bảng tạm có tên là deleted.
- Trigger Update: Trigger được phát biểu bởi for update. Trigger này sẽ
được thực hiện khi tiến hành sửa một mẫu tin trong bảng. Mẫu tin
bị thay đổi sẽ được lưu trong 2 bảng tạm có tên là Inserted (chứa giá
trị mới) và Deleted (chứa giá trị cũ).
- Inserted và Deleted là 2 table tạm chỉ chứa trên bộ nhỏ và chỉ có giá
trị bên trong trigger mà thơi (nghĩa là chỉ nhìn thấy được trong
trigger mà thơi). Ta có thể dùng thông tin trong 2 table này để so 12



Trigger dạng INSTEAD OF – Thay thế
Dạng INSTEAD OF sẽ bỏ qua sự kiện đã kích hoạt trigger mà thay vào đó sẽ thực hiện các
dịng lệnh SQL bên trong Trigger
INSTEAD OF được chia làm 3 loại nhỏ: INSTEAD OF INSERT, INSTEAD OF UPDATE và
INSTEAD OF DELETE.
Ví dụ:create database Test1 go use Test1 go
create table HangHoa(MaHD int, NgayHD Datetime, GhiChu ntext,
MaSP NVarchar(10), Soluong int, DonGia float) go
create Table NhapHangHoa(MaHD int, NgayHD Datetime, GhiChu ntext) go
create Table NhapHangHoaCT(MaHD int,MaSP NVarchar(10), Soluong int, DonGia float) go

CREATE TRIGGER dbo.Trig_Instead ON HangHoa instead of INSERT
AS Begin
insert into NhapHangHoa select MaHD , NgayHD , GhiChu from inserted
insert into NhapHangHoaCT select MaHD ,MaSP , Soluong , DonGia from inserted
End go
insert into HangHoa values(1,getdate() , 'GhiChu ntext','MaSP', 101, 12.1)
select * from hanghoa
select * from NhapHangHoa
select * from NhapHangHoaCT
--Drop database Test1
13



Trigger dạng FOR
CREATE TRIGGER Ktra_DonGia1 ON [dbo].[Products]
FOR INSERT

AS
If exists( Select * from inserted i where
i.dongiamua>i.dongiaban)
Begin
RollBack tran
RaisError ('Khong hop le', 16,1)
End


14


Hàm Update() trong các trigger
CREATE TRIGGER Ktra_DonGia2 ON [dbo].[Products]
FOR UPDATE AS

If Update(dongiamua) or Update(dongiaban)
Begin
If exists( Select 'true' from inserted i where
i.dongiamua>i.dongiaban)

Begin
RollBack tran
RaisError ('Khong hop le', 16,1)
End
End
15


Debug trigger
Để gỡ rối một trigger chúng ta phải viết một procedure có gọi các thao
tác làm phát sinh sự kiện để thực thi trigger. Ví dụ để kiểm tra các
trigger Ktra_DonGia1 và Ktra_DonGia2 chúng ta viết thủ


tục sau
CREATE PROCEDURE dbo.DebugTrigger as

insert into Products(Masp, Tensp, Mota, Donvitinh,
Dongiamua, Dongiaban, VAT)
Values ( 'SP-01', ‘San Pham-01 ' , '@Mota' ,'@donvi',
20,10 , 1 )
GO
16



Quản lý triggers
• DML Trigger
– Chọn folder bảng của một CSDL
– Kích phải chuột vào folder trigger
• DDL Trigger
– Chọn server | Databases | database |
Programmability | Database Triggers.
– Chọn server | Server Objects | Server Triggers.

17



Execute As
• Tự thực hành với các tham số khác nhau của Execute As

(xem lại bài về Procedure)

18


Bài tập áp dụng
• Cho bảng dữ liệu Emp_Mg gồm các trường sau:
– Emp_ID: mã nhân viên
– Mg_ID: mã người quản lý nhân viên Emp

– NoOfReports: số nhân viên cấp dưới của Emp
• CREATE TABLE Emp_Mg (Emp_ID VARCHAR(10)
PRIMARY KEY, Mg_ID VARCHAR(10) NULL, NoOfReports
INT DEFAULT 0, CONSTRAINT FK_Emp FOREIGN KEY
(Mg_ID) REFERENCES Emp_Mg (Emp_ID))

19


Bài tập áp dụng (2)
Xây dựng các trigger trên bảng này nhằm đảm bảo:
1. Mỗi nhân viên chỉ có nhiều nhất một thủ trưởng cấp trên trực tiếp.

2. Mỗi nhân viên khơng được làm thủ trưởng của chính mình.
3. Kiểm tra xem thủ trưởng của nhân viên có tồn tại khơng.
4. Chỉ có một người trong cơ quan là có chức vụ cao nhất
(Mg_ID=null).
5. Khi sửa đổi dữ liệu có thể xuất hiện tình huống: một nhân viên là
thủ trưởng của chính mình thơng qua các nhân viên khác. => viet
trigger dam bao la nhan vien khong duoc la thu truong cua chinh
minh.
6. Khi xóa một nhân viên x thì sẽ tự động thay nhân viên x trong
trường Mg_ID bằng nhân viên cấp trên trực tiếp của x.
7. Viết trigger điền giá trị cho trường NoOfReports (số nhân viên
dưới quyền)

(Xem lecture10_trigger.doc)
20



×