1. Trang chủ
  2. » Giáo án - Bài giảng

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

20 2,5K 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 20
Dung lượng 186 KB

Nội dung

Ngăn cấm thay đổi loginUser-- Ngan cam can thiep den loginUserCREATE_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 h

Trang 1

Bài 10: Trigger

• Khái niệm về trigger

• Trigger DDL

• Trigger DML

Trang 2

- 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)

Khái niệm về trigger

Trang 3

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)

Trang 4

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

Trang 5

Trigger trên server

Trang 6

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]

Trang 7

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

Trang 8

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

Trang 9

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)

Trang 10

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

Trang 11

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.

Trang 12

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 sánh data cũ và mới hoặc kiểm tra xem data mới

Trang 13

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

Trang 14

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

Trang 15

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

Trang 16

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

Trang 17

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

Trang 18

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)

Trang 19

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))

Trang 20

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)

Ngày đăng: 16/06/2014, 13:47

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w