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

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

Đ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

Bài 10: Trigger • Khái niệm trigger • Trigger DDL • Trigger DML Khái niệm trigger - Trigger kiểu thủ tục kích họat tự động theo kiện (events) - Có 02 lọai triggers: + Data Modification Language –DML (For | After triggers, Instead-of triggers) + DDL triggers (For | After triggers) 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 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 triggers tự động gọi sau máy thực lệnh sau: Create Table, Drop Table, Alter Procedure, Drop Schema, Create Login, … (Xem BOL:DDL triggers, events used for firing) Data Definition Language (DDL) Trigger Tạo trigger sau để tự động thông báo lỗi có 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 have a permission to change tables,temporarily disablethe trigger by using: DISABLE TRIGGER trdPreventTableChanges ON DATABASE ENABLE TRIGGER trdPreventTableChanges ON DATABASE;', 16, 1) ROLLBACK; GO go drop trigger trgPreventTableChanges on database go use master go drop database Test1 Trigger server 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] Ngăn cấm thay đổi loginUser Ngan cam can thiep den loginUser(CREATE_LOGIN, DROP_LOGIN, ALTER_LOGIN) ALL SERVER - định ràng trigger họat động tất CSDL server 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 Event Data Trigger Cho phép ghi lại thay đổi 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 Execute As • Tự thực hành với tham số khác Execute As (xem lại Procedure) DML Triggers • Cú Pháp: -Tạo CREATE TRIGGER ON | [With encryption|EXECUTE AS { CALLER | SELF | 'user_name' } ] {[FOR| AFTER] [insert],[update],[delete] | Instead of} AS Transact-SQL statements - Xoá Drop Trigger - DISABLE TRIGGER { trigger_name [ , n ] | ALL } ON object_name ON: Chỉ Trigger viết cho bảng view With encryption: nội dung trigger mã hóa 10 Các dạng họat động DML trigger • AFTER (FOR): câu lệnh bên trigger thực sau kiện tạo nên trigger xảy • INSTEAD OF: bỏ qua kiện kích hoạt trigger mà thay vào thực dịng lệnh SQL bên Trigger Ví dụ: ta có Update trigger table với câu INSTEAD OF: Khi ta thực việc update liệu bảng thay update liệu, SQL Server thực lệnh viết sẵn bên trigger 11 Chú ý - Trigger tạo bảng tạm thời hay bảng hệ thống Trigger kích hoạt cách tự động event Insert, Update, Delete mà khơng thể chạy manually Có thể áp dụng trigger cho View - Trigger Insert: Trigger phát biểu for insert Trigger thực tiến hành thêm mẫu tin vào bảng Mẫu tin cần thêm lưu bảng tạm có tên Inserted - Trigger Delete: Trigger phát biểu for delete Trigger thực tiến hành xóa mẫu tin bảng Mẫu tin bị xóa lưu bảng tạm có tên deleted - Trigger Update: Trigger phát biểu for update Trigger thực tiến hành sửa mẫu tin bảng Mẫu tin bị thay đổi lưu bảng tạm có tên Inserted (chứa giá trị mới) Deleted (chứa giá trị cũ) - Inserted Deleted table tạm chứa nhỏ có giá trị bên trigger mà (nghĩa nhìn thấy trigger mà thơi) Ta dùng thông tin table để so 12 Trigger dạng INSTEAD OF – Thay Dạng INSTEAD OF bỏ qua kiện kích hoạt trigger mà thay vào thực dịng lệnh SQL bên Trigger INSTEAD OF chia làm loại nhỏ: INSTEAD OF INSERT, INSTEAD OF UPDATE 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() 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 trigger phải viết procedure có gọi thao tác làm phát sinh kiện để thực thi trigger Ví dụ để kiểm tra trigger Ktra_DonGia1 Ktra_DonGia2 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 , ) GO 16 Quản lý triggers • DML Trigger – Chọn folder bảng 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 tham số khác Execute As (xem lại Procedure) 18 Bài tập áp dụng • Cho bảng liệu Emp_Mg gồm 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 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 trigger bảng nhằm đảm bảo: Mỗi nhân viên có nhiều thủ trưởng cấp trực tiếp Mỗi nhân viên không làm thủ trưởng Kiểm tra xem thủ trưởng nhân viên có tồn khơng Chỉ có người quan có chức vụ cao (Mg_ID=null) Khi sửa đổi liệu xuất tình huống: nhân viên thủ trưởng thơng qua nhân viên khác => viet trigger dam bao la nhan vien khong duoc la thu truong cua chinh minh Khi xóa nhân viên x tự động thay nhân viên x trường Mg_ID nhân viên cấp trực tiếp x Viết trigger điền giá trị cho trường NoOfReports (số nhân viên quyền) (Xem lecture10_trigger.doc) 20 ... DML trigger • AFTER (FOR): câu lệnh bên trigger thực sau kiện tạo nên trigger xảy • INSTEAD OF: bỏ qua kiện kích hoạt trigger mà thay vào thực dịng lệnh SQL bên Trigger Ví dụ: ta có Update trigger. .. Transact -SQL statements - Xoá Drop Trigger - DISABLE TRIGGER { trigger_ name [ , n ] | ALL } ON object_name ON: Chỉ Trigger viết cho bảng view With encryption: nội dung trigger mã hóa 10. .. View - Trigger Insert: Trigger phát biểu for insert Trigger thực tiến hành thêm mẫu tin vào bảng Mẫu tin cần thêm lưu bảng tạm có tên Inserted - Trigger Delete: Trigger phát biểu for delete Trigger

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

Từ khóa liên quan

Mục lục

  • Bài 10: Trigger

  • Data Definition Language (DDL) Trigger

  • Slide 4

  • Trigger trên server

  • Trigger ngăn cấm việc tạo userlogin

  • Ngăn cấm thay đổi loginUser

  • Event Data Trigger

  • Execute As

  • DML Triggers

  • Các dạng họat động của DML trigger

  • Chú ý

  • Trigger dạng INSTEAD OF – Thay thế

  • Trigger dạng FOR

  • Hàm Update() trong các trigger

  • Debug trigger

  • Quản lý triggers

  • Slide 18

  • Bài tập áp dụng

  • Bài tập áp dụng (2)

Tài liệu cùng người dùng

Tài liệu liên quan