Triggers And Views

Một phần của tài liệu HỌC SQL SERVER 2000 (Trang 51 - 61)

bi t g i là Triggers và dùng Views đ th hi n data trong m t hay nhi u table

nh th nào.

Triggers

Trigger là m t lo i stored procedure đ c bi t đ c execute (th c thi) m t cách

t đ ng khi có m t data modification event x y ra nh Update, Insert hay

Delete. Trigger đ c dùng đ đ m b o Data Integrity hay th c hi n các business

rules nào đó.

Khi nào ta c n s d ng Trigger:

• Ta ch s d ng trigger khi mà các bi n pháp b o đ m data

intergrity khác nh Constraints không th th a mãn yêu c u c a

ng d ng. Nên nh Constraint thu c lo i Declarative Data

Integrity cho nên s ki m tra data tr c khi cho phép nh p vào table trong khi Trigger thu c lo i Procedural Data Integrity nên vi c insert, update, delete đã x y ra r i m i kích ho t trigger.

Chính vì v y mà ta c n cân nh c tr c khi quy t đnh dùng lo i nào

trong vi c đ m b o Data Integrity.

• Khi m t database đ c denormalized (ng c l i quá trình

normalization, là m t quá trình thi t k database schema sao cho database ch a data không th a không thi u) s có m t s data

th a (redundant ) đ c ch a trong nhi u tables. Ngh a là s có

m t s data đ c ch a cùng m t lúc hai hay nhi u n i

khác nhau. Khi đó đ đ m b o tính chính xác thì khi data đ c

update m t table này thì c ng ph i đ c update m t cách t

đ ng các table còn l i b ng cách dùng Trigger.

Ví d : ta có table Item trong đó có field Barcode dùng đ xác đnh m t m t hàng nào đó. Item table có vai trò nh m t cu n catalog ch a nh ng thông tin c n thi t mô t t ng m t hàng. Ta có m t

table khác là Stock dùng đ ph n ánh món hàng có th c trong kho

b o tính chính xác. Ví d nh khi m t món hàng đ c bán đi thì s

l ng hàng trong table Item gi m đi m t món đ ng th i t ng s

hàng trong kho (Stock table) c ng ph i gi m theo m t cách t đ ng. Nh v y ta có th t o m t trigger trên Item table đ m i khi

m t món đ c bán đi thì trigger s đ c kích ho t và gi m t ng s

hàng trong Stock table.

Ð c đi m c a Trigger:

• M t trigger có th làm nhi u công vi c (actions) khác nhau và có

th đ c kích ho t b i nhi u h n m t event. Ví d ta có th vi t

m t trigger đ c kích ho t b i b t k event nào nh Update, Insert

hay Delete và bên trong trigger ta s vi t code đ gi i quy t cho

t ng tr ng h p.

• Trigger không th đ c t o ra trên temporary hay system table.

• 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.

• Khi m t trigger đ c kích ho t thì data m i v a đ c insert hay

m i v a đ c thay đ i s đ c ch a trong Inserted table còn

data m i v a đ c delete đ c ch a trong Deleted table. Ðây là 2

table t m ch ch a trên memory và ch có giá tr bên trong trigger

mà thôi (ngh a là ch nhìn th y và đ c query 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 v a thay đ i có h p l tr c

khi commit hay roll back. (Xem thêm ví d bên d i)

• Có 2 lo i triggers (class) : INSTEAD OF và AFTER. Lo i INSTEAD

OF s b qua (bybass) action đã 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 thì khi table

đ c update thay vì update SQL Server s th c hi n các l nh đã

đ c vi t s n bên trong trigger. Ng c l i lo i AFTER (lo i default

t ng đ ng v i keyword FOR) s th c hi n các câu l nh bên

trong trigger sau khi các action t o nên trigger đã x y ra r i. T o M t Trigger Nh Th Nào?

Cú pháp c n b n đ t o ra m t trigger có d ng nh sau:

CREATE TRIGGER trigger_name

ON table_name or view_name

FOR trigger_class and trigger_type(s)

AS Transact-SQL statements

Nh v y khi t o ra m t trigger ta ph i ch rõ là t o ra trigger trên table nào và

đ c trigger khi nào (insert, update hay delete. Sau ch AS là các câu l nh SQL

x lý công vi c.

Ta hãy nghiên c u m t ng d ng th c ti n sau. Gi s ta vi t m t application cho phép user có th Insert, Update và Delete nh ng thông tin n m trong

database. User này th ng là nh ng ng i không thông th o l m v computer

mà chúng tôi th ng g i đùa là "bà tám". Vào m t ngày đ p tr i, "bà tám" m t mày tái xanh đ n c u c u ta vì đã l tay "delete" nh ng thông tin khá quan tr ng và hy v ng ta có th ph c h i d li u dùm. N u chúng ta không phòng xa

tr c khi vi t application thì coi nh c ng vô ph ng c u ch a vì data đã hoàn

toàn b delete.

Nh ng n u b n là m t "guru" b n s g t gù "chuy n này khó l m!" nh ng sau đó b n ch t n vài phút đ ng h đ rollback. Mu n làm đ c chuy n này chúng ta ph i dùng m t "chiêu" g i là Audit (ki m tra hay giám sát). T c là ngoài các table chính ta s thêm các table ph g i là Audit tables. B t k ho t đ ng nào

đ ng ch m vào m t s table quan tr ng trong database ta đ u ghi nh n vào

trong Audit table. Ví d khi user update hay delete m t record trong table nào đó

thì tr c khi update hay delete ta s âm th m di chuy n record đó sang Audit

table r i m i update hay delete table chính. Nh v y n u có chuy n gì x y ra ta có th d dàng rollback (tr record v ch c ).

ghi nh n th i đi m x y ra s thay đ i, có vai trò nh m t con d u.

(N u trong môi tr ng nhi u user thì ta thêm m t column UserID đ ghi nh n

user nào thay đ i).

Sau đó ta s t o ra 3 trigger dùng cho vi c audit nh sau:

--Insert Trigger

CREATE TRIGGER [AuditInsertOrders]

ON [dbo].[Orders]

FOR Insert

AS

insert into aud_orders select *,'I',getdate() From inserted

--Update Trigger

CREATE TRIGGER [AuditUpdateOrders]

ON [dbo].[Orders]

for UPDATE

AS

insert into aud_orders select *,'U',Getdate() from deleted

--Delete Trigger

CREATE TRIGGER [AuditDeleteOrders]

ON [dbo].[Orders]

FOR DELETE

AS

insert into aud_orders select *,'D',getdate() From deleted

Trong ví d trên khi user insert m t record thì record m i v a đ c insert s

n m trong inserted table nh đã trình bày ph n trên. Do đó ta s select t t c các column trong inserted table c ng thêm Audit Type "I" và dùng hàm

GetDate() trong SQL Server đ l y system date time dùng cho Date_Time_Stamp

column, sau đó insert vào Aud_Orders table. T ng t v i tr ng h p Update và

Delete, record đã đ c update hay delete n m trong deleted table.

Nh v y tr l i tr ng h p thí d trên n u "bà tám" yêu c u ta có th vào tìm ki m trong audit table đ ph c h i l i record. Ngoài ra ta có th dùng table này

Ð t o ra hay xem m t trigger b ng Enterprise Manager b n làm nh sau:

Right-Click lên table mà b n mu n t o trigger->All Tasks-> Manage Triggers.

L u ý: Ðôi Khi ta ch mu n trigger th c s ho t đ ng khi m t hay vài column

nào đó đ c Update ch không ph i b t k column nào. Khi đó ta có th dùng

hàm Update(Column_Name) đ ki m tra xem column nào đó có b update hay không.

Ví d :

T o m t trigger cho Customer table. Bên trong Trigger (sau ch AS) ta có th

ki m tra xem n u column First_Name hay Last_Name b thay đ i thì m i hành

đ ng n u không thì không làm gì c

IF UPDATE (first_name) OR UPDATE (Last_Name) BEGIN

Do some conditional processing when either of these columns are updated.

END

N u mu n ki m tra nhi u columns ta có th dùng hàm khác là

Columns_Updated() . Xin xem thêm trong SQL Server Books Online đ bi t thêm chi ti t v cách s d ng.

Views

Ð nh ngh a m t cách đ n gi n thì view trong SQL Server t ng t nh Query

trong Access database. View có th đ c xem nh m t table o mà data c a nó

đ c select t m t stored query. Ð i v i programmer thì view không khác chi so

v i table và có th đ t v trí c a table trong các câu l nh SQL. Ð c đi m c a View là ta có th join data t nhi u table và tr v m t recordset đ n. Ngoài ra ta có th "xào n u" data (manipulate data) tr c khi tr v cho user b ng cách dùng m t s logic checking nh (if, case...).

Ví d :

Create View OrderReport

As

Select OrderID,

(case when [Name] is null then 'New Customer'

else [Name]

end )As CustomerName, ProductName, DateProcessed

From Customers Right Outer Join Orders on Customers.CustomerID=Orders.CustomerID

View Th ng Ð c Dùng Vào Vi c Gì?

View th ng đ c s dùng vào m t s công vi c sau:

T p trung vào m t s data nh t đnh : ta th ng dùng view đ select m t s data mà user quan tâm hay ch u trách nhi m và lo i b nh ng data không c n thi t.

Ví d : Gi s trong table ta có column "Deleted" v i giá tr là True hay

False đ đánh d u m t record b delete hay không. Vi c này đôi khi

đ c dùng cho vi c Audit. Ngh a là trong m t ng d ng nào đó khi

user delete m t record nào đó, thay vì ta physically delete record ta ch logically delete b ng cách đánh d u record là đã đ c "Deleted" đ

đ phòng user yêu c u roll back. Nh v y ch y u ta ch quan tâm đ n

data ch a delete còn data đã đ c đánh d u deleted ch đ c đ ý khi

nào c n roll back hay audit mà thôi. Trong tr ng h p này ta có th

t o ra m t view select data mà Deleted=False và làm vi c ch y u trên view thay vì toàn b table.

Ð n gi n hóa vi c x lý data: Ðôi khi ta có nh ng query r t

ph c t p và s d ng th ng xuyên ta có th chuy n nó thành View

và đ i x nó nh m t table, nh v y s làm cho vi c x lý data d

dàng h n.

Customize data: Ta có th dùng view đ làm cho users th y data

t nh ng góc đ khác nhau m c dù h đang dùng m t ngu n data

gi ng nhau. Ví d : Ta có th t o ra views trong đó nh ng thông tin

v customer đ c th hi n khác nhau tùy login ID là normal user

hay manager.

Export và Import data: Ðôi khi ta mu n export data t SQL Server sang các ng d ng khác nh Excel ch ng h n ta có th dùng view đ join nhi u table và export dùng bcp.

Khi s d ng view ta có th select,insert, update, delete data bình th ng nh v i m t table.

Ví d :

Select * From OrderReport

Where DateProcessed <'2003-01-01'

L u ý: Trong Enterprise Edition (và Developer Edition) ta có th t o Index cho

View nh cho table. Index s đ c bàn đ n trong các bài sau.

Mu n hi u rõ h n v bài h c này b n c n làm bài t p s 3.

Nh v y trong bài này chúng ta đã tìm hi u Trigger, View trong SQL Server và

m t s ng d ng c a nó. Nói chung view th ng đ c dùng đ tr u t ng hóa

(abstract) hay l c raw data (data thô) tr c khi tr v cho user trong khi trigger

th ng đ c dùng đ b o đ m tính integrity c a database.

Exercise 1: Advanced Query

Please follow those steps to practise:

1. Create a new database called PracticeDB (using Enterprise Manager (EP) or Query Analyser (QA))

2. Create 2 tables and insert data as follows (use EP or QA) :

Customers CustomerID (Int) Name (nVarChar(50)) 1 John Nguyen 2 Bin Laden 3 Bill Clinton 4 Thomas Hardy 5 Ana Tran 6 Bob Carr Orders OrderID (Int) CustomerID (Int) ProductName (nvarchar(50)) DateProcessed (datetime) 1 2 Nuclear Bomb ‘2002-12-01’ 2 3 Missile ‘2000-03-02’ 3 2 Jet-1080 ‘2003-08-03’ 4 1 Beers ‘2001-05-12’ 5 4 Asian Food ‘2002-10-04’

( Hints: Based on the data supplied and your knowledge about various kind of joins guess the results then after each select compare it with your guessing to check if what you understand is correct. You also use As keyword or alias in the queries)

4. Using “Select * Into...From” statement to create a new table called “Processed Orders” and populate the new table with the data selecting from Orders table Where DateProcessed is earlier than ‘2002-10-05’. (use QA)

5. Using “Insert Into...Select” statement to get the top 1 record from “Orders” table and insert into the “ProcessedOrders” (use QA)

6. Delete a record from ProcessedOrders where the date processed is ‘2002-10-04’. (use QA)

7. Using Union to merge the two data set from Orders and ProcessedOrders into one data set. (use QA)

8. Apply Constraints (use EP or QA)

a.Apply the Primary Constraint to the “ID” column in the tables b. Apply the Foreign Key Constraint in the Orders table.

c. Apply the Check Constraint to the DateProcessed column so that the date is within ‘1970-01-01’ – ‘2005-01-01’ and try to insert invalid data to see if SQL rejects.

d. Apply Unique Constraint to the CustomerName column of Customers 9. Back up database and Restore to somewhere else (on a different server or on the same server but with different database name) (use EP or QA)

Exercise 2: Manipulate Data and Stored Procedure Please follow those steps to practise:

9. Use bcp to export all data from Orders table of PracticeDB to c:\Orders.txt (or to c:\Orders.csv)

10.Change some data in the c:\Orders.txt and save. Then import to Orders table from the text file using bcp

11.Import Orders.txt to Orders table using BULK INSERT

12.Create a Linked Server ‘LinkedPracticeDB’ which link to an Access database ‘PracticeDB.mdb’ (firstly you have to create an Access database similar to PracticeDB in SQL Server and input some data). Then do a select data using four- part name and OPENQUERY

13.Using ad hoc computer name with OPENROWSET and

OPENDATASOURCE functions to select data from ‘PracticeDB.mdb’

14.Create the following Cursor

DECLARE @au_lname varchar(40), @au_fname varchar(20) DECLARE Employee_Cursor CURSOR FOR

SELECT LastName, FirstName FROM Northwind.dbo.Employees OPEN Employee_Cursor

FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname WHILE @@FETCH_STATUS = 0

BEGIN

PRINT 'Author:' + @au_fname + ' ' + @au_lname

FETCH NEXT FROM Employee_Cursor INTO @au_lname, @au_fname END

CLOSE Employee_Cursor

DEALLOCATE Employee_Cursor

15.Create the following stored procedure and try to execute with some values CREATE PROCEDURE AddNewOrder

@OrderID smallint,

@ProductName varchar(50), @CustomerName varchar(50),

@Result smallint=1 Output AS

DECLARE @CustomerID smallint BEGIN TRANSACTION

If not Exists(SELECT CustomerID FROM Customers WHERE [Name]=@CustomerName)

END Else BEGIN INSERT INTO [Orders](OrderID,ProductName,CustomerID) VALUES(@OrderID,@ProductName,@CustomerID) SELECT @Result=0 COMMIT TRANSACTION END END Else BEGIN

If Exists(SELECT OrderID FROM [Orders] WHERE OrderID=@OrderID) BEGIN SELECT @Result=1 ROLLBACK TRANSACTION END Else BEGIN INSERT INTO [Orders](OrderID,ProductName,CustomerID) VALUES(@OrderID,@ProductName,@CustomerID) SELECT @Result=0 COMMIT TRANSACTION END END Print @Result Return

9. Using VB 6 or VB.NET to execute the ‘AddNewOrder’ stored procedure 10. Using xp_cmdshell extended stored procedure to send a message (xp_cmdshell ‘net send Hello’)

Exercise 3: Triggers And Views Please follow those steps to practise:

16.Create 3 triggers to audit the changes to the Orders table.

Tips:

• Create an audit table “aud_Orders” with the same colums as in the Orders table and 2 more colums AuditType(with values either ‘I’,’U’,’D’) and DateTimeStamp(which will record the date time stamp of changes)

• Create Update Triggers (Similar to Insert,Delete) : when a record in the Orders table is updated the trigger will move the old record to the audit table(record the date time and mark it as ‘U’)

17.Create a view that shows all the orders with the following colums: OrderID,CustomerName,ProductName,DateProcessed,Status

Business rules:

If CustomerName is a null value “New Customer” is returned

If DateProcessed is later than current date return “Pending”, if DateProcessed is ealier return “History” in Status colum.

Tips:

a. Using Case When ...Then statement in the view b. Using Getdate() function to get the current date time

Một phần của tài liệu HỌC SQL SERVER 2000 (Trang 51 - 61)

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

(61 trang)