Chương 9 Views & Lập trình trong SQL

1

Views (virtual tables) trong SQL

• View: là một bảng đơn được tạo ra từ các bảng cơ sở hoặc từ các view được tạo trước – View không tồn tại vật lý vì vậy view còn gọi là

– Đơn giản hoá việc truy cập dữ liệu – Chọn dữ liệu cần thiết ứng với mổi user, đảm bảo

bảng ảo.

– Dùng để Import và export – View là một đối tượng của CSDL

an toàn dữ liệu

Views (virtual tables) trong SQL

• Cú pháp tạo view:

CREATE VIEW view_name [(column[ ,...n ])] AS select_statement [ WITH CHECK OPTION ] Ví dụ: CREATE VIEW WORKS_ON1 AS SELECT FNAME, LNAME, PNAME, HOURS FROM EMPLOYEE, PROJECT, WORKS_ON

WHERE SSN=ESSN AND PNO=PNUMBER;

Views (virtual tables) trong SQL

Ví dụ:

CREATE VIEW DEPTJNFO (DEPT_NAME,NO_OF_EMPS,TOTAL_SAL) AS SELECT DNAME, COUNT (*), SUM (SALARY) FROM DEPARTMENT, EMPLOYEE WHERE DNUMBER=DNO GROUP BY DNAME;

Views (virtual tables) trong SQL

Ví dụ:

CREATE TABLE WORKS_ON_NEW AS

SELECT FNAME, LNAME, PNAME, HOURS

FROM EMPLOYEE, PROJECT, WORKS_ON

WHERE SSN=ESSN AND PNO=PNUMBER

GROUP BY PNAME;

Views (virtual tables) trong SQL

• Câu lệnh select trong view không được

chứa: – Mệnh đề ORDER BY – Mệnh đề COMPUTE VÀ COMPUTE BY – Các bảng tạm không được tham chiếu trong

view không dùng select Into trong view

– Các trigger và chỉ mục không được tạo ra trên

6

view

Views (virtual tables) trong SQL

• DELETE VIEW:

DROP VIEW view_name

• RENAME Views:

sp_rename old_viewname, new_viewname

• CHECK VIEW:

sp_helptext viewname

• MODIFY VIEW :

ALTER VIEW view_name (column_list) AS select_statement

Lập trình trong SQL

• Lập trình CSDL: Giao tiếp với chương trình

ứng dụng – Chương trình bao gồm: Biến (variable), câu lệnh

• Các khái niệm cơ bản: – Định danh (Identifiers) – Batch (tập các câu lệnh T-SQL liên tiếp kết thúc

bằng lệnh GO)

SQL và cấu trúc điều khiển.

– Script

Lập trình trong SQL

• Kiểu dữ liệu: Có 2 loại

– Kiểu dữ liệu của hệ thống (System - supplied data

type)

defined data type) • Reference to object:

– Kiểu dữ liệu do người dùng định nghĩa (User-

Server.database.owner.object

Biến

• Biến cục bộ (Local variable)

– Cú pháp khai báo:

DECLARE@ VariableName var_type

– Ví dụ: DECLARE @EmpIDVar int

Biến

– Gán giá trị cho biến: Khi một biến được khai báo thì

giá trị của nó là Null SET @VariableName = expression or SELECT{@VariableName=expression} [,…n]

– Ví dụ 1:

DECLARE @temp_name varchar(20) SELECT @temp_name = companyname FROM customers WHERE customerid = ‘adsff’

Biến

DECLARE @temp_city varchar(10) SET @temp_city = ‘london’ SELECT * FROM Customers WHERE city = @temp_city

– Ví dụ 2:

Biến

SELECT @temp_name = CompanyName FROM Customers

Where CustomerID = @temp_CustID

PRINT ‘CustomerID is ‘ + @temp_CustID + ‘ and Name is ‘+

@temp_name

– Ví dụ 3: DECLARE @temp_CustID Char(5), @temp_name varchar(50) SET @temp_CustID = ‘ALFKI’

Biến

• Biến toàn cục (Global Variables): là một hàm

hệ thống. – Giá trị trả về của hàm được hiển thị bởi câu lệnh

– Không gán giá trị cho biến toàn cục. – Biến toàn cục không có kiểu – Tên biến được bắt đầu với @@.

SELECT @@Variablename.

Biến

• Một số biến toàn cục thông dụng

– @@SERVERNAME: trả về tên của server – @@ROWCOUNT: số dòng chịu tác dụng của câu

– @@ERROR: trả về chỉ số index của lỗi – @@IDENTITY: trả về định danh .

lệnh cuối cùng.

Biến

Ví dụ:

return

Update Employees set LastName = ‘Brooke’ Where LastName =‘Brook’ If(@@rowcount =0)

begin print ‘No rows were updated’ end

Cách thực thi câu lệnh SQL

• Cú pháp:

Example: DECLARE @vname varchar(20), @table varchar(20),

@vdbase varchar(20)

SET @vname="'White'" SET @table='authors' SET @vdbase='pub' EXECUTE ('USE'+@vdbase + 'SELECT * FROM '+ @ vtable

+ 'WHERE au_lastname=‘+@vname)

EXEC [USE] ({@string_variable| [ N ] 'tsql_string'} [+ ...n ] )

Cách thực thi câu lệnh SQL

• Batches: là một tập các câu lệnh SQL gửi đến server và được thực thi tại cùng một thời điểm. – Nếu một câu lệnh trong batch bị lỗi thì SQL server sẽ không thực thi tất cả những câu lệnh trong batches.

– Mỗi batch không thể chứa tất cả những câu lệnh sau: CREATE PROCEDURE, CREATE TRIGGER, CREATE VIEW, CREATE RULE, CREATE DEFAULT.

Cách thực thi câu lệnh SQL

Ví dụ: go use master if exists(select * from sysdatabases where name like

'sales')

drop database sales go create database sales on ( name = sales_data, filename ='e:\sales_data.mdf', size

= 1, maxsize = 5, filegrowth =1)

log on ( name = sales_log, filename ='e:\sales_log.ldf', size = 1,

maxsize = 2, filegrowth =1)

Cách thực thi câu lệnh SQL

• Transact-SQL Scripts:

– Script là một tập các câu lệnh T-SQL được lưu trữ

• Transactions: là một đơn vị công việc với 4 đặc

điểm sau: – Atomic (nguyên tố) – Consistent (nhất quán) – Isolated (cô lập) – Durable (bền)

trong một file với một hoặc nhiều batchs.

Cách thực thi câu lệnh SQL

• Cấu trúc của Transaction:

BEGIN TRANSACTION []

[WITH MARK ]… … [SAVE TRANSACTION ]… ROLLBACK TRANSACTION [ | ]

COMMIT TRANSACTION

Cách thực thi câu lệnh SQL

Ví dụ: BEGIN TRAN

UPDATE authors SET city=‘San Jose’ Where au_lname=‘smith’ INSERT titles VALUES(‘BU1122’,’Teach Yourself SQL’,’business’, ‘9988’, $35.00, $1000,10,4501,’a great book’)

SELECT *from titleauthor

COMMIT TRAN

Cách thực thi câu lệnh SQL

• Ví dụ:

BEGIN TRAN

DELETE Sales where titles_id =‘BU1032’ if @@ERROR >0 ROLLBACK TRAN (huỷ hoàn toàn giao tác) else

COMMIT TRAN

Cấu trúc điều khiển

• IF … ELSE

IF boolean_expression

{sql_statement | statement_block}

[ELSE boolean_expression

{sql_statement | statement_block}]

Cấu trúc điều khiển

• BEGIN …END

{sql_statement | statement_ block}

BEGIN END

Cấu trúc điều khiển

• Ví dụ:

IF ( SELECT COUNT(*) FROM authors

WHERE contract =0) >0 BEGIN PRINT 'These authors do not have contracts on file: ' SELECT au_lname, au_fname, au_id FROM authors WHERE contract=0 END

BEGIN PRINT 'All authors have contracts on file.' END

ELSE

Cấu trúc điều khiển

• WHILE

WHILE boolean_expression {sql_statement | statement_block} [BREAK] {sql_statement | statement_block} [CONTINUE]

Cấu trúc điều khiển

Ví dụ 1:

DECLARE @counter INT

INSERT INTO Pubs..paractice VALUES ('last'+CAST(@counter as char(2)), 'First') SET @counter=@counter+1

SET @counter=0 WHILE (@counter<20) BEGIN END

Cấu trúc điều khiển

Ví dụ 2:

WHILE (SELECT AVG(price) FROM titles) < $30 BEGIN

UPDATE titles SET price = price * 2 SELECT MAX(price) FROM titles IF (SELECT MAX(price) FROM titles) > $50 BREAK ELSE CONTINUE

END PRINT 'Too much for the market to bear'

Cấu trúc điều khiển

• CASE

– Cú pháp CASE đơn giản

CASE input_expression WHEN when_expression THEN result_expression [ ...n ] [ELSE else_result_expression ] END

Cấu trúc điều khiển

– Cú pháp CASE đầy đủ:

result_expression [ ...n ]

WHEN Boolean_expression THEN [ ELSE else_result_expression ]

CASE END

Cấu trúc điều khiển

Ví dụ: SELECT Category =

ELSE 'Not yet categorized‘

CASE type WHEN 'popular_comp' THEN 'Popular Computing' WHEN 'mod_cook' THEN 'Modern Cooking' WHEN 'business' THEN 'Business' WHEN 'psychology' THEN 'Psychology' WHEN 'trad_cook' THEN 'Traditional Cooking END CAST(title AS varchar(25)) AS 'Shortened Title', price AS Price FROM titles WHERE price IS NOT NULL ORDER BY type, price COMPUTE AVG(price) BY type

Cấu trúc điều khiển

WHEN Quantity <=5 THEN 0.05 WHEN Quantity BETWEEN 6 and 10 THEN 0.07 WHEN Quantity BETWEEN 11 and 20 THEN 0.09

0.1

Ví dụ: SELECT ProductID, Quantity, UnitPrice, [discount%]= CASE ELSE END FROM [Order Details] ORDER BY Quantity, ProductId

Cấu trúc điều khiển

• PRINT: Hiển thị kết quả câu lệnh SQL

PRINT ‘any ACII Text’|@local_variable| @@FUNTION| String_expr

• RETURN

RETURN [integer_expression] integer_expression : return value

• WAITFOR

WAITFOR { DELAY 'time' | TIME 'time' }

Cấu trúc điều khiển

Ví dụ:

BEGIN WAITFOR TIME '22:20' END

EXECUTE update_all_stats

Cấu trúc điều khiển

• RAISERROR

RAISERROR({msg_id | msg_str} { , severity , state } [ , argument [ ,...n ] ] ) [ WITH option [ ,...n ] ]

Thủ tục (Stored Procedures) và Hàm (Function)

Giới thiệu

• Stored procedure (SP): là một đoạn mã chứa

các khái báo hoặc các câu lệnh SQL. – Stored procedure được lưu trữ trong danh mục CSDL server và nó có thể được gọi từ trigger, một thủ tục khác hoặc một ứng dụng phía client.

– Stored procedures có thể được tạo trong CSDL và

tái sử dụng.

– Thủ tục nhận tham số đầu vào và trả về một kết

quả.

Loại Stored procedures

• System SP (sp): được lưu trữ trong CSDL Master,

nhưng có thể thực thi ở bất kỳ CSDL nào. – sp_helptext: In nội dung của rule, a default, an unencrypted stored procedure, user-defined function, trigger, computed column, or view. Example : master.dbo.sp_helptext – sp_help: Xuất thông tin về một đối tượng của CSDL. – sp_depends: Hiển thị thông tin về đối tượng của CSDL phụ thuộc vào view(s), trigger(s), và procedure(s) trong CSDL.

Loại Stored procedures

Extended SP (xp): được tạo từ ngôn ngữ khác (C++,...) và được sử dụng như một thủ tục của SQL Server

‒Local sp: là đối tượng trong CSDL dùng để thực thi các tác vụ, có thể tạo trong CSDL master.

‒Temporary sp: local (tên bắt đầu với #) và

global (tên bắt đầu với ##).

 User_defined :

Tạo stored procedures

• Cú pháp:

CREATE PROC [EDURE ] procedure_name

[ ; number ] [ { @parameter data_type }

[ VARYING ] [ = default ] [ OUTPUT ] ] [,...n ]

[ WITH { RECOMPILE | ENCRYPTION |

RECOMPILE, ENCRYPTION } ]

[FOR REPLICATION ]

AS sql_statement [ ...n ]

Tạo stored procedures

Ví dụ: CREATE PROCEDURE OrderSummary AS SELECT Ord.EmployeeID, SummSales=SUM(OrDet.UnitPrice*OrDet.Quantity ) FROM Orders AS Ord JOIN [Order Details] AS OrDet ON (Ord.OrderID = OrDet.OrderID) GROUP BY Ord.EmployeeID

Thực thi stored Procedures

• Execute: Dùng để thực thi – User-defined function. – System procedure. – User-defined stored procedure, – Extended stored procedure.

Thực thi stored Procedures

• Cú pháp:

44

[ [ EXEC [ UTE ] ] {[ @return_status = ] { procedure_name [ ;number ] | @procedure_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] ] [,...n ] [ WITH RECOMPILE ]

Thực thi stored Procedures

– Hoặc:

EXECUTE ProductName [ ; number ]

Ví dụ:

[[, …n][ OUTPUT ]]

EXECUTE dbo.overdueOrders

Hiệu chỉnh stored Procedures

• Cú pháp:

sql_statement [...n]

ALTER PROC[EDURE] procedure_name [WITH option] AS

Hiệu chỉnh stored Procedures

orderDate,1)

orderDate,

Ví dụ: ALTER PROC dbo.overdueOrders AS SELECT CONVERT(CHAR(8), RequiredDate,1) RequiredDate, CONVERT(CHAR(8), orderId, Customerid, EmployeeID FROM dbo.orders WHERE RequiredDate

Xóa stored Procedures

• Cú pháp:

DROP PROC owner.stored_procedure_name

Tham số trong stored Procedures

• Input parameter:

CREATE PROCEDURE procedure_name [@parameter_name data_type] [=default_value] [WITH option] AS sql_statement [...n]

Tham số trong stored Procedures

Ví dụ1:

CREATE PROC dbo.MovieByRating @rating varchar(5) = NULL AS SELECT rating , title FROM movie WHERE rating = @rating ORDER BY title

Tham số trong stored Procedures

Ví dụ 2:

PRINT ‘Message Line 1’ PRINT ‘Message Line 2’

BEGIN RETURN

CREATE PROC sp_name

@parameter data_type =value AS IF @parameter IS NULL END SELECT statement GO

51

create proc ptbn @a int,@b int as if(@a=0) print 'Phuong trinh vo nghiem.' else print 'phuong trinh co nghiem la:‘ +cast(cast(-@b as float)/@a as nvarchar(12)) go

Viết thủ tục có tham số a, b dạng input để giải phương trình bậc nhất ax+b=0.

declare @a int declare @b int set @a=0 set @b=6 exec ptbn @a,@b

Tham số trong stored Procedures

• Output parameter:

CREATE PROCEDURE procedure_name [@parameter_name data_type] [=default_value]

OUTPUT [WITH option] AS sql_statement [...n]

Tham số trong stored Procedures

Ví dụ:

CREATE PROC count_row

@movie_count int OUTPUT

AS SELECT @movie_count = COUNT(*) FROM Movie GO Sp execution with output parameter: a variable must be declared to stored the return value of the output parameter

DECLARE @num int EXEC count_row @num OUTPUT SELECT @num

Quản lý lỗi

• sp_addmessage: Lưu thông báo lỗi mới do người dùng định nghĩa trong một thể hiện của Database Engine – Thông báo sys.messages.

• Cú pháp:

thể được xem bằng lỗi có

sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg' [ , [ @lang= ] 'language' ] [ , [ @with_log= ] { 'TRUE' | 'FALSE' } ] [ , [ @replace= ] 'replace' ]

Quản lý lỗi

EXEC sp_addmessage @msgnum = 50001, @severity = 10, @msgtext=‘Cannot delete customer. Customer has

orders .’, @withlog = ‘true’ GO

Ví dụ: Create an error message by sp_addmessage

Quản lý lỗi

Example: Display an error message when delete a customer CREATE PROC DeleteCust @cust_num nvarchar(5) = null

RAISERROR (50001, 10, 1) RETURN

BEGIN END

DELETE FROM Customers

AS IF EXISTS (SELECT customerID FROM Orders WHERE customerID like @cust_num) WHERE customerID like @cust_num

GO

Quản lý lỗi

• @@ERROR: trả về số của lỗi nếu lệnh trước

đó gặp lỗi Ví dụ:

USE AdventureWorks2008R2; GO UPDATE HumanResources.EmployeePayHistory SET PayFrequency = 4 WHERE BusinessEntityID = 1; IF @@ERROR = 547 PRINT N'A check constraint violation occurred.'; GO

Quản lý lỗi

• @@ERROR và @@ROWCOUNT: sử dụng để xác nhận tính hợp lệ của câu lệnh UPDATE. – Giá trị của @@ERROR được kiểm tra cho bất kỳ

– Giá trị của @@ROWCOUNT được sử dụng để chắc chắn lệnh cập nhật thành công vào các dòng trong bảng.

dấu hiệu của một lỗi.

Hàm (FUNCTION)

• Hàm hệ thống (System function):

 aggregate funtion: avg(), count(), count(*),

sum(), max(), min(),...

 Other function: getdate(), month(), upper(),

• Hàm do người dùng định nghĩa (User-defined

user_name(),@@rowcount,...

function): Cho phép định nghĩa một hàm T-SQL mà nó có thể chấp nhận một hoặc nhiều tham số và trả về một giá trị đơn hoặc một bảng giá trị.

Hàm (FUNCTION)

• Có 3 loại hàm do người dùng định nghĩa:

– Scalar: trả về một giá trị đơn dựa trên giá trị đầu

vào.

dòng.

– Multi-statement Table-valued: trả về một tập các

– Inline Table-valued: trả về một tập các dòng.

Hàm (FUNCTION)

• Scalar function: CREATE FUNCTION [ owner_name. ] function_name

( [ { @parameter_name [AS] scalar_parameter_data_type [= default ] } [ ,...n ] ] )

RETURNS scalar_return_data_type. [WITH < function_option> [ [,] ...n] ] [AS ]

BEGIN function_body RETURN scalar_expression END

Hàm (FUNCTION)

Ví dụ:

DECLARE @Ordnum tinyint SELECT @Ordnum = count(orderid) FROM Orders

RETURN @Ordnum

CREATE FUNCTION dbo.OrderNum (@monthOrd tinyint ) RETURNS tinyint AS BEGIN WHERE month(orderdate)= @monthOrd END GO

Hàm (FUNCTION)

• Thực thi hàm:

SELECT dbo.OrderNum(7)

Select orderid from orders Where dbo.OrderNum(7)>50 and month(orderdate)=7

– Hoặc dùng trong mệnh đề Where

Hàm (FUNCTION)

Table-valued Functions CREATE FUNCTION [ owner_name. ] function_name ([{ @parameter_name [AS] scalar_parameter_data_type [= default ] } [,...n ] ]) RETURNS TABLE [WITH < function_option > [ [,] ...n ] ] [AS ] RETURN [(] select-stmt [)]

Hàm (FUNCTION)

Ví dụ:

(SELECT c.CategoryName, P. ProductName, SUM(Quantity) AS TotalQty FROM Categories c

CategoryID

INNER JOIN [Order Details] od ON p.ProductID = od.ProductID WHERE c.CategoryID= @Categoryid

CREATE FUNCTION SalesByCategory(@Categoryid Int) RETURNS TABLE AS RETURN INNER JOIN Products p ON c.CategoryID= p. GROUP BY c. CategoryName,p.ProductName)

Hàm (FUNCTION)

• Multistatement Table-valuesd CREATE FUNCTION [owner_name.]function_name ([{@parameter_name [AS] data_type [=default]} [ ,…n ]]) RETURNS @return_variable TABLE ({column_definition | table_constraint} [ ,…n ]) [WITH { ENCRYPTION | SCHEMABINDING } [ [,] ...n] ] [AS]

BEGIN

function_body RETURN

END

(ContactName

nvarchar(30),

Phone

TABLE

Ví dụ: CREATE FUNCTION Contacts(@suppliers bit=0) RETURNS @Contacts nvarchar(24), ContactType nvarchar(15)) AS

BEGIN INSERT @Contacts SELECT ContactName, Phone, 'Customer' FROM Customers INSERT @Contacts SELECT FirstName + ' ' + LastName, HomePhone, 'Employee' FROM Employees IF @Suppliers=1

INSERT @Contacts SELECT ContactName, Phone, 'Supplier‘ FROM Suppliers RETURN END

Hàm (FUNCTION)

FROM

CONTACTS(1) ORDER

BY

• Thực thi: * SELECT ContactName

TRIGGERS-CURSOR

Trigger

• Trigger là một loại thủ tục đặc biệt, tự động thực thi khi một sự kiện xãy ra trong database server.

• DML triggers: thực thi khi người dùng cố hiệu chỉnh dữ liệu thông qua một sự kiện ngôn ngữ thao tac dữ liệu (DML).

• DML events gồm: các câu

lệnh

INSERT,

UPDATE, or DELETE trên bảng hoặc view

Tạo trigger

• Cú pháp:

CREATE TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [DELETE] [,] [ INSERT ] [, ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS sql_statement [ ...n ] } }

Tạo trigger

– Schema_name: tên của lược đồ chứa trigger. – Table | view: tên bảng hoặc View mà trên đó

trigger thực thi.

– WITH ENCRYPTION: mã hóa trigger. – FOR | AFTER | INSTEAD OF: loại trigger

Tạo trigger

• AFTER triggers hoặc FOR trigger :

– Thực thi sau khi thực hiện insert/ delete các dòng

trong table, gọi là reactive, chỉ tạo trên table.

là AFTER Trigger

74

– Khi tạo trigger nếu không chỉ định rõ thì mặc định

Tạo trigger

INSTEAD OF triggers: kiểm tra trứơc khi thực hiện Insert/Delete, gọi là proactive, tạo trên table và view.

– Table1 có trigger1, table2 có trigger2, nếu thao tác trên table1 có liên quan đến table2 thì trigger2 tự động thực thi, gọi là trigger lồng (Nested Trigger)

Tạo trigger

For/After

Instead of

- Chỉ áp dụng cho table

- áp dụng cho table, view

- Chỉ định nghĩa một Trigger trên một hành động I/U/D

- Có thể định nghĩa nhiều trigger trên một hành động I/U/ D

+ Xử lý ràng buộc + Thay thế hành động

Thực thi sau khi : + xử lý ràng buộc + thực hiện xong hành động I/U/D phát sinh trigger

- Thi hành trước khi: phát sinh trigger

- Không xây dựng được trên table có áp dụng cascade delete/ update

76

Tạo trigger

• Khi Insert mẫu tin mới vào Table thì mẫu tin mới

đó cũng lưu trong table INSERTED

• Khi Delete mẫu tin trong table: Thì các mẫu tin bị xoá đó được di chuyển sang table DELETED.

• Khi Update mẫu tin trong table: thì table đó và table INSERTED đều chứa mẫu tin có nội dung mới, còn DELETED chứa mẫu tin có nội dung cũ.

– {[DELETE] [ , ] [INSERT] [ , ] [UPDATE] }: chỉ định thao tác mà khi thực hiện thì trigger tự động thực thi

Tạo trigger

• Chỉ định thêm một trigger • WITH APPEND không được dùng với INSTEAD OF

triggers.

– WITH APPEND

• Trigger sẽ không thực hiện khi bảng có liên quan

đến kỹ thuật sao chép nhân bản (relication)

• sql_statement: câu lệnh SQL chứa điều kiện và hành

động của triiger.

– NOT FOR REPLICATION

Tạo trigger

Ví dụ: tạo một trigger hiển thị số dòng được chèn vào bảng Nhomsach

tin duoc chen', 0, 1,

RAISERROR('Có %D mau @@ROWCOUNT) PRINT 'Có ' + CAST(@@ROWCOUNT AS CHAR)+' mẫu tin được chèn'

CREATE TRIGGER Thongbaomautin ON NHOMSACH FOR INSERT AS

Tạo trigger

Ví dụ:

Print ‘You cannot delete the Productid=12’ RollBack transaction

CREATE TRIGGER NoDelete ON Product FOR DELETE AS IF(SELECT ProductID FROM Deleted )=12 BEGIN END

Tạo trigger

Ví dụ:

PRINT ‘You cannot update Productid’ RollBack Transaction

CRETE TRIGGER NoUppdate ON Product FOR Update IF Update(ProductID)

BEGIN END

Tạo trigger

CREATE TRIGGER NoupdareOrders

Print ‘Ngay lap hoa don <=ngay hien hanh’ RollBack Transaction

Ví dụ: ON Orders

FOR Update AS IF (Select OrderDate from Deleted) > Getdate() BEGIN END

RAISERROR(500103,10,1)

Ví dụ: CREATE TRIGGER Trg_NgayLap_NgayGiaoHD ON Hoadon AFTER INSERT AS DECLARE @NgayLapHD DateTime, @NgayGiao DateTime SELECT @NgayLapHD=hd.NGayLapHD,NgayGiao=hd.NgayGiaoNhan FROM HoaDon hd INNER JOIN Inserted i ON hd.MaHD=i.Mahd If @NgayGiao<@NgayLapHD

BEGIN ROLLBACK TRANSACTION END

Ví dụ: AFTER TRIGGERS

IN (SELECT hd.MaHD FROM HoaDon hd INNER JOIN Deleted d ON hd.MaHD=d.Mahd)

CREATE TRIGGER Trg_Xoa_HD ON Hoadon AFTER DELETE AS SET NOCOUNT ON IF EXISTS (SELECT * FROM Deleted) BEGIN DELETE CT_HOADON WHERE CT_HOADON.MaHD RAISERROR('Cac chi tiet HD da bi xoa',10,1) END SET NOCOUNT ON

Hiệu chỉnh Triggers

• Syntax:

ALTER TRIGGER [ schema_name . ]trigger_name ON { table | view } [ WITH ENCRYPTION ] { { { FOR | AFTER | INSTEAD OF } { [DELETE] [,] [ INSERT ] [, ] [ UPDATE ] } [ WITH APPEND ] [ NOT FOR REPLICATION ] AS sql_statement [ ...n ] } }

Hiệu chỉnh Triggers

Ví dụ: ALTER TABLE [Order Details]

• Xóa trigger:

– DROP TRIGGER Trigger_Name

DISABLE TRIGGER ALL

Con trỏ

hệ thống khi câu lệnh SQL được thực thi.

• Con trỏ là vùng làm việc tạm được tạo trong bộ nhớ

• Con trỏ chứa thông tin của câu lệnh select, sau khi cursor được định vị trên một dòng, các hoạt động có thể thực hiện trên dòng đó hoặc khối các dòng bắt đầu từ vị trí con trỏ.

• Con trỏ có thể chứa nhiều hơn một dòng nhưng chỉ

thao tác trên một dòng tại một thời điểm.

Loại con trỏ

• Implicit cursors:

– Được tạo mặc định khi câu lệnh INSERT, UPDATE, DELETE được thực thi và khi câu lệnh SELECT trả về đúng một dòng được thực thi.

• Explicit cursors:

– Được tạo khi thực thi câu lệnh SELECT và trả về

nhiều hơn một dòng.

– Mặc dù cursor lưu trữ nhiều record nhưng chỉ có một record được thực thi tại một thời điểm gọi là record hiện hành.

Khai báo con trỏ

• Cú pháp:

DECLARE cursor_name CURSOR [ LOCAL | GLOBAL ] [ FORWARD_ONLY | SCROLL ] [ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [,...n ] ] ]

Sử dụng con trỏ

trong SQL Server: – Khai báo cursor – Mở cursor. – Lấy mẫu tin hoặc điều hướng cursor (FETCH) – Dữ liệu trong dòng hiện hành có thể được hiệu

• Các thao tác cần thực hiện trong khi sử dụng cursor

chỉnhnếu cần thiết.

90

– Đóng cursor nhưng vẫn tồn tại. – Giải phóng Cursor(deallocate) khi không dùng nữa.

Sử dụng con trỏ

• Open cursor:

• Fetch cursor: Access each line of data

OPEN {cursor_name }

| ABSOLUTE n | RELATIVE n]]

FETCH [[NEXT | PRIOR | FIRST | LAST FROM cursor_name [INTO @variable_name [,...n ] ]

Sử dụng con trỏ

• Delete data by cursor:

• Close cursor:

DELETE WHERE CURRENT OF

• DEALLOCATE: Removes a cursor reference

CLOSE cursor_name

DEALLOCATE cursor_name

• Ví dụ:

c.CustomerID,c.Companyname,c.contactname,

o.OrderID,o.OrderDate

@od DATETIME, @cn VARCHAR( 80)

DECLARE MyCursor CURSOR FOR SELECT FROM Customers c, Orders o WHERE c.CustomerID = o.CustomerID FOR UPDATE --Open cursor OPEN MyCursor DECLARE @cid VARCHAR( 8), @c VARCHAR( 80), @o INT, FETCH NEXT FROM MyCursor INTO @cid, @c, @cn, @o, @od SELECT @cid BEGIN TRANSACTION

UPDATE Customers SET CompanyName = 'q' WHERE CURRENT OF Mycursor DEALLOCATE MyCursor SELECT * FROM Customers ROLLBACK TRANSACTION

Review questions

1.Howdoes SQL allow implementation of general

integrity constraints?

2.What is a view in SQL, and how is it defined? Discuss the problems that may arise when one attempts to update a view. How are views typically implemented?

3.List the three main approaches to database programming. What are the advantagesand disadvantages of each approach?

Review questions

4. What is the impedance mismatch problem? Which of the three programming approaches minimizes this problem?

5. Describe the concept of a cursor and how it is

used in embedded SQL.

6. What is SQLJ used for? Describe the two

types of iterators available in SQL

Review questions

• State which of the following queries and updates would be allowed on the view. If a query or update would be allowed, show what the corresponding query or update on the base relations would look like, and give its result when appliedto the database of Figure 5.6.

Review questions