Chương 9: Views & Lập trình 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à bảng ảo. – Đơ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 an toàn dữ liệu – Dùng để Import và export – View là một đối tượng của CSDL

pdf97 trang | Chia sẻ: lylyngoc | Lượt xem: 3665 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chương 9: Views & Lập trình trong SQL, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
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à bảng ảo. – Đơ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 an toàn dữ liệu – Dùng để Import và export – View là một đối tượng của CSDL Views (virtual tables) trong SQL • Cú pháp tạo view: Ví dụ: CREATE VIEW view_name [(column[ ,...n ])] AS select_statement [ WITH CHECK OPTION ] 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 view 6 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 SQL và cấu trúc điều khiển. • 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) – 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) – Kiểu dữ liệu do người dùng định nghĩa (User- defined data type) • Reference to object: Server.database.owner.object Biến • Biến cục bộ (Local variable) – Cú pháp khai báo: – Ví dụ: DECLARE @EmpIDVar int DECLARE@ VariableName var_type 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 – Ví dụ 1: DECLARE @temp_name varchar(20) SELECT @temp_name = companyname FROM customers WHERE customerid = ‘adsff’ SET @VariableName = expression or SELECT{@VariableName=expression} [,…n] Biến – Ví dụ 2: DECLARE @temp_city varchar(10) SET @temp_city = ‘london’ SELECT * FROM Customers WHERE city = @temp_city Biến – Ví dụ 3: DECLARE @temp_CustID Char(5), @temp_name varchar(50) SET @temp_CustID = ‘ALFKI’ SELECT @temp_name = CompanyName FROM Customers Where CustomerID = @temp_CustID PRINT ‘CustomerID is ‘ + @temp_CustID + ‘ and Name is ‘+ @temp_name 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 SELECT @@Variablename. – 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 @@. 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 lệnh cuối cùng. – @@ERROR: trả về chỉ số index của lỗi – @@IDENTITY: trả về định danh . Biến Ví dụ: Update Employees set LastName = ‘Brooke’ Where LastName =‘Brook’ If(@@rowcount =0) begin print ‘No rows were updated’ return 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ữ trong một file với một hoặc nhiều batchs. • 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) 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 BEGIN {sql_statement | statement_ block} 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 ELSE BEGIN PRINT 'All authors have contracts on file.' END 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 SET @counter=0 WHILE (@counter<20) BEGIN INSERT INTO Pubs..paractice VALUES ('last'+CAST(@counter as char(2)), 'First') SET @counter=@counter+1 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 đủ: CASE WHEN Boolean_expression THEN result_expression [ ...n ] [ ELSE else_result_expression ] END Cấu trúc điều khiển Ví dụ: SELECT Category = 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 ELSE 'Not yet categorized‘ 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 Ví dụ: SELECT ProductID, Quantity, UnitPrice, [discount%]= CASE WHEN Quantity <=5 THEN 0.05 WHEN Quantity BETWEEN 6 and 10 THEN 0.07 WHEN Quantity BETWEEN 11 and 20 THEN 0.09 ELSE 0.1 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 • RETURN • WAITFOR PRINT ‘any ACII Text’|@local_variable| @@FUNTION| String_expr RETURN [integer_expression] integer_expression : return value WAITFOR { DELAY 'time' | TIME 'time' } Cấu trúc điều khiển Ví dụ: BEGIN WAITFOR TIME '22:20' EXECUTE update_all_stats END 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  User_defined : ‒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 ##). 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: Ví dụ: EXECUTE dbo.overdueOrders EXECUTE ProductName [ ; number ] [[, …n][ OUTPUT ]] Hiệu chỉnh stored Procedures • Cú pháp: ALTER PROC[EDURE] procedure_name [WITH option] AS sql_statement [...n] Hiệu chỉnh stored Procedures Ví dụ: ALTER PROC dbo.overdueOrders AS SELECT CONVERT(CHAR(8), RequiredDate,1) RequiredDate, CONVERT(CHAR(8), orderDate,1) orderDate, orderId, Customerid, EmployeeID FROM dbo.orders WHERE RequiredDate<GETDATE()and shippeddate is null ORDER BY 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: CREATE PROC sp_name @parameter data_type =value AS IF @parameter IS NULL BEGIN PRINT ‘Message Line 1’ PRINT ‘Message Line 2’ RETURN END SELECT statement GO 51 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. 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 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 lỗi có thể được xem bằng sys.messages. • Cú pháp: sp_addmessage [ @msgnum= ] msg_id , [ @severity= ] severity , [ @msgtext= ] 'msg' [ , [ @lang= ] 'language' ] [ , [ @with_log= ] { 'TRUE' | 'FALSE' } ] [ , [ @replace= ] 'replace' ] Quản lý lỗi Ví dụ: Create an error message by sp_addmessage EXEC sp_addmessage @msgnum = 50001, @severity = 10, @msgtext=‘Cannot delete customer. Customer has orders .’, @withlog = ‘true’ GO Quản lý lỗi Example: Display an error message when delete a customer CREATE PROC DeleteCust @cust_num nvarchar(5) = null AS IF EXISTS (SELECT customerID FROM Orders WHERE customerID like @cust_num) BEGIN RAISERROR (50001, 10, 1) RETURN END DELETE FROM Customers 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ỳ dấu hiệu của một lỗi. – 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. Hàm (FUNCTION) • Hàm hệ thống (System function):  aggregate funtion: avg(), count(), count(*), sum(), max(), min(),...  Other function: getdate(), month(), upper(), user_name(),@@rowcount,... • Hàm do người dùng định nghĩa (User-defined 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. – Multi-statement Table-valued: trả về một tập các dòng. – 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 [ [,] ...n] ] [AS ] BEGIN function_body RETURN scalar_expression END Hàm (FUNCTION) Ví dụ: CREATE FUNCTION dbo.OrderNum (@monthOrd tinyint ) RETURNS tinyint AS BEGIN DECLARE @Ordnum tinyint SELECT @Ordnum = count(orderid) FROM Orders WHERE month(orderdate)= @monthOrd RETURN @Ordnum END GO Hàm (FUNCTION) • Thực thi hàm: SELECT dbo.OrderNum(7) – Hoặc dùng trong mệnh đề Where Select orderid from orders Where dbo.OrderNum(7)>50 and month(orderdate)=7 Hàm (FUNCTION) Table-valued Functions CREATE FUNCTION [ owner_name. ] function_name ([{ @parameter_name [AS] scalar_parameter_data_type [= default ] } [,...n ] ]) RETURNS TABLE [WITH [ [,] ...n ] ] [AS ] RETURN [(] select-stmt [)] Hàm (FUNCTION) Ví dụ: CREATE FUNCTION SalesByCategory(@Categoryid Int) RETURNS TABLE AS RETURN (SELECT c.CategoryName, P. ProductName, SUM(Quantity) AS TotalQty FROM Categories c INNER JOIN Products p ON c.CategoryID= p. CategoryID INNER JOIN [Order Details] od ON p.ProductID = od.ProductID WHERE c.CategoryID= @Categoryid 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 Ví dụ: CREATE FUNCTION Contacts(@suppliers bit=0) RETURNS @Contacts TABLE (ContactName nvarchar(30), Phone 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) • Thực thi: SELECT * FROM CONTACTS(1) ORDER BY 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. – Khi tạo trigger nếu không chỉ định rõ thì mặc định là AFTER Trigger 74 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 76 For/After Instead of - Chỉ áp dụng cho table - áp dụng cho table, view - Có thể định nghĩa nhiều trigger trên một hành động I/U/ D - Chỉ định nghĩa một Trigger trên một hành động I/U/D 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: + Xử lý ràng buộc + Thay thế hành động phát sinh trigger - Không xây dựng được trên table có áp dụng cascade delete/ update Tạo trigger – {[DELETE] [ , ] [INSERT] [ , ] [UPDATE] }: chỉ định thao tác mà khi thực hiện thì trigger tự động thực thi • 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ũ. Tạo trigger – WITH APPEND • Chỉ định thêm một trigger • WITH APPEND không được dùng với INSTEAD OF triggers. – NOT FOR REPLICATION • 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. Tạo trigger Ví dụ: tạo một trigger hiển thị số dòng được chèn vào bảng Nhomsach CREATE TRIGGER Thongbaomautin ON NHOMSACH FOR INSERT AS RAISERROR('Có %D mau tin duoc chen'