Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 13 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
13
Dung lượng
316,23 KB
Nội dung
Hệ quản trị CSDL SQL Server Table Sử dụng cú pháp CREATE TABLE để xây dựng bảng theo yêu cầu sau: - Bảng khách hàng (Customers) gồm cột: CustomerID, CompanyName, Phone, Fax, Address, ContactName Trong quy định CustomerID khóa Tên cột Kiểu liệu NULLl NOT NULL CustomerID Nchar(5) NOT NULL CompanyName Nvarchar(40) NOT NULL Phone Nvarchar(24) NULL Fax Nvarchar(24) NULL Address Nvarchar(60) NULL ContactName Nvarchar(30) NULL - Bảng nhân viên (Employees) gồm cột: EmployeeID, LastName, FirstName, BirthDate, Photo, IDNo, Notes, HireDate Trong quy định EmployeeID khóa tăng tự động 1, IDNo (Unique) Tên cột Kiểu liệu NULLl NOT NULL EmployeeID Int IDENTITY (1,1) NOT NULL LastName Nvarchar(20) NOT NULL FirstName Nvarchar(14) NOT NULL BirthDate Datetime NULL Photo Image NULL IDNo Nvarchar(10) NOT NULL Notes Ntext NULL HireDate Datetime NULL - Bảng hàng hóa (Products) gồm cột: ProductID, ProductName, UnitPrice Trong quy định ProductID khóa chính, kiểm tra giá trị cột UnitPrice > Tên cột Kiểu liệu NULLl NOT NULL ProductID Int IDENTITY (1,1) NOT NULL ProductName Nvarchar(40) NOT NULL ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server UnitPrice Money NULL - Bảng đơn đặt hàng (Orders) gồm cột: OrderID, OrderDate, TotalAmount, CustomerID, EmployeeID Trong quy định OrderID khóa tự động tăng 10248, giá trị mặc định cho OrderDate ngày hành, giá trị mặc định cho cột TotalAmount 0, CustomerID khóa ngoại tham chiếu qua bảng Customers, EmployeeID khóa ngoại tham chiếu qua bảng Employees Tên cột Kiểu liệu NULLl NOT NULL OrderID Int IDENTITY (10248,1) NOT NULL OrderDate Datetime NULL TotalAmount Money NOT NULL CustomerID Nchar(5) NOT NULL EmployeeID Int NOT NULL - Bảng chi tiết đặt hàng (OrderDetails) gồm cột: OrderID, ProductID, UnitPrice, Quantity Trong quy định OrderID, ProductID khóa chính, OrderID khóa ngoại tham chiếu qua bảng Orders, ProductID khóa ngoại tham chiếu qua bảng Products, kiểm tra giá trị cột UnitPrice > giá trị cột Quantity > Tên cột Kiểu liệu NULLl NOT NULL OrderID Int NOT NULL ProductID Int NOT NULL UnitPrice Money NOT NULL Quantity Smallint NOT NULL Lưu câu lệnh CREATE TABLE vừa tạo vào tập tin có phần mở rộng *.sql để sau tạo nhanh lại bảng Triggers 2.1 Khái niệm Trigger loại stored procedure định nghĩa đặc biệt để thực thi cách tự động có câu lệnh UPDATE, INSERT DELETE tác động vào table Trigger cơng cụ mạnh, liệu bị sửa đổi tự động thực việc ép buộc giao dịch ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server sửa đổi theo qui tắc định (các ràng buộc liệu) nhằm mục đích đảm bảo tính tồn vẹn liệu Các table có nhiều trigger Câu lệnh CREATE TRIGGER định nghĩa với mệnh đề FOR UPDATE, FOR INSERT, FOR DELETE Các câu lệnh chứa bên trigger khơng có khác với stored procedure Các trigger thực thi sau câu lệnh bên chúng hoàn thành Nếu tồn câu lệnh sai với lỗi, ví dụ lỗi vi phạm ràng buộc lỗi cú pháp, trigger không thực thi 2.2 Tạo trigger 2.2.1 Tạo trigger công cụ Enterprise Manager Chọn server group Ỉ chọn server Chọn Databases Ỉ chọn database chứa table muốn tạo trigger Ỉ click Tables Trong khung trình bày đối tượng table database Ỉ click phải chuột tên table muốn tạo trigger Ỉ chọn All Tasks Ỉ chọn Manage Triggers … Tại mục Name, click ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server Trong hộp thoại Text, gõ vào nội dung trigger Click Check Syntax để kiểm tra lỗi cú pháp 2.2.2 Tạo trigger sử dụng T-SQL 2.2.2.1 Tạo trigger loại INSERT TRIGGER Khái niệm Trigger loại insert tự động thi hành câu lệnh bên có thao tác insert xảy table mà gắn INSERT TRIGGER dùng trường hợp sau: Thông báo, khuyến cáo, nhắc nhở, phản hồi thơng tin có thao tác thêm mẫu tin Thực xử lý tính tốn cập nhật liệu dựa giá trị vừa thêm Tự động kiểm tra vi phạm ràng buộc khóa chính, khóa ngoại Cú pháp CREATE TRIGGER trigger_name ON { table | view } FOR INSERT AS sql_statement Ví dụ Với CSDL tạo ban đầu, viết trigger INSERT bảng ORDERS cho thêm dòng liệu vào bảng ORDERS phải kiểm tra cột khóa ngoại: cột CustomerID ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server bảng CUSTOMERS, cột EmployeeID bảng EMPLOYEES CREATE TRIGGER [ORDERS_INSERT] ON [ORDERS] FOR INSERT AS Kiem tra cot CustomerID table CUSTOMERS DECLARE @Cust int, @Emp int, @Msg varchar (50) SET @Cust=1 IF EXISTS (SELECT * FROM INSERTED WHERE CustomerID IN (SELECT CustomerID FROM CUSTOMERS)) SET @Cust=0 Kiem tra cot EmployeeID table EMPLOYEES SET @Emp=1 IF EXISTS (SELECT * FROM EMPLOYEES n, INSERTED i WHERE n.EmployeeID = i.EmployeeID) SET @Emp=0 Xet gia tri cac bien @Cust, @Emp Neu @Cust=0 va @Emp=0 thi luu mau tin moi them Nguoc lai, thong bao loi vi pham rang buoc khoa ngoai SET @Msg= CASE WHEN @Cust=0 AND @Emp=0 then 'TC' WHEN @Cust=0 AND @Emp=1 then 'Khong ton tai EmployeeID table EMPLOYEES' WHEN @Cust=1 AND @Emp=0 then 'Khong ton tai CustomerID table CUSTOMERS' WHEN @Cust=1 AND @Emp=1 then 'Khong ton tai EmployeeID table EMPLOYEES, CustomerID table CUSTOMERS' END IF @Msg='TC' PRINT 'Da luu cong' ELSE BEGIN PRINT @Msg ROLLBACK TRAN END Lưu ý ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server Bảng INSERTED bảng phát sinh tự động trigger loại INSERT TRIGGER Bảng dùng để lưu trữ thông tin dòng liệu trước đưa vào bảng liệu SQL 2.2.2.2 Tạo trigger loại DELETE TRIGGER Khái niệm Loại trigger dùng để kiểm tra tồn liệu bên bảng Tùy theo yêu cầu mà hệ thống thông báo tự động xóa liệu bên bảng liệu bên bảng cha bị xóa Cú pháp CREATE TRIGGER trigger_name ON { table | view } FOR DELETE AS sql_statement Ví dụ Với CSDL tạo ban đầu, viết trigger DELETE bảng PRODUCTS cho xóa ProductID trigger phải kiểm tra tồn ProductID có liên quan bảng ORDERDETAILS Khi đó, ProductID có tồn bảng ORDERDETAILS thơng báo khơng thể xóa Ngược lại, thơng báo xóa ProductID CREATE TRIGGER [PRODUCTS_DELETE] ON [dbo].[PRODUCTS] FOR DELETE AS Kiem tra cot ProductID co table ORDERDETAILS IF (SELECT count(*) FROM ORDERDETAILS c, DELETED d WHERE c.ProductID = d.ProductID) >0 BEGIN ROLLBACK TRAN PRINT 'Khong the xoa' END ELSE PRINT 'Da xoa' Lưu ý Bảng DELETED bảng phát sinh tự động trigger loại DELETE TRIGGER Bảng dùng để lưu trữ dịng liệu bị xóa 2.2.2.3 Tạo trigger loại UPDATE TRIGGER Khái niệm Thực chất hành động UPDATE phối hợp hai hành động: DELETE INSERT ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server Thông thường hành động bên biến cố UPDATE dùng để kiểm tra tồn giá trị khóa ngoại có liên quan Để kiểm tra giá trị cột có bị thay đổi bên biến cố UPDATE, sử dụng hàm UPDATE với biến cố sau: UPDATE (col_name) Trả True: giá trị cột bị thay đổi Trả False: giá trị cột không bị thay đổi Cú pháp CREATE TRIGGER trigger_name ON { table | view } FOR UPDATE AS sql_statement Ví dụ Với CSDL tạo ban đầu, viết trigger bảng CUSTOMERS, biết thay đổi CustomerID trigger tự động thay đổi bảng ORDERS CREATE TRIGGER [CUSTOMERS_UPDATE] ON [dbo].[CUSTOMERS] FOR UPDATE AS Khai bao bien DECLARE @Demdong int, @NewCustomerID nchar(5), @OldCustomerID nchar(5) SET @Demdong = @@rowcount IF @Demdong = RETURN IF UPDATE (CustomerID) BEGIN Kiem tra cot CustomerID co table ORDERS IF EXISTS(SELECT * FROM ORDERS c, DELETED d WHERE c.CustomerID = d.CustomerID) BEGIN Lay gia tri moi CustomerID Ỉ bien SELECT @NewCustomerID = CustomerID FROM INSERTED Lay gia tri cu CustomerID Æ bien SELECT @OldCustomerID = CustomerID FROM DELETED UPDATE ORDERS SET CustomerID = @NewCustomerID WHERE CustomerID = @OldCustomerID IF @@ERROR 0 BEGIN PRINT 'CustomerID ko thay doi' ROLLBACK TRAN END ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server ELSE PRINT 'CustomerID da thay doi' END PRINT 'CustomerID da thay doi' END 2.2.2.4 Tạo trigger tính toán tự động Với CSDL tạo ban đầu, viết trigger tính tốn tự động sử dụng lệnh UPDATE để tính lại giá trị cho cột TotalAmount bảng ORDERS biết giá trị cột tổng số lượng * đơn giá hàng hóa bảng ORDERDETAILS Tăng giá trị cột TotalAmount thêm dòng liệu bảng ORDERDETAILS CREATE TRIGGER [ORDERDETAILS_INSERT] ON [dbo].[ORDERDETAILS] FOR INSERT AS Kiem tra tinh hop le cua du lieu bang ORDERDETAILS: OrderID ORDERS.OrderID, ProductID ∈ PRODUCTS.ProductID, Quantity > 0, UnitPrice > Kiem tra cot OrderID table ORDERS ∈ DECLARE @OrderID int, @ProductID int, @KT int, @Msg varchar (50) SET @OrderID=1 IF EXISTS (SELECT * FROM INSERTED WHERE OrderID IN (SELECT OrderID FROM ORDERS)) SET @OrderID=0 Kiem tra cot ProductID table PRODUCTS SET @ProductID=1 IF EXISTS (SELECT * FROM PRODUCTS n, INSERTED i WHERE n.ProductID = i.ProductID) SET @PRODUCTID=0 Kiem tra cot Quantity, UnitPrice table ORDERDETAILS SET @KT=1 IF EXISTS (SELECT * FROM INSERTED i WHERE i.Quantity>0 AND i.UnitPrice>0) SET @KT=0 Xet gia tri cac bien @OrderID, @ProductID, @KT Neu @OrderID=0, @ProductID=0 va @KT=0 thi luu mau tin moi them Nguoc lai, thong bao loi vi pham rang buoc khoa ngoai SET @Msg= CASE WHEN @OrderID=0 AND @ProductID=0 AND @KT=0 then 'TC' ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server END IF @Msg='TC' PRINT 'Da luu cong' ELSE BEGIN PRINT @Msg ROLLBACK TRAN END Tang gia tri cho cot TotalAmount table ORDERS DECLARE @nOrderID int, @Nsl money, @nDG smallint SELECT @nOrderID = OrderID, @nSL = Quantity, @nDG = UnitPrice FROM INSERTED UPDATE ORDERS SET TotalAmount = TotalAmount + @Nsl * @Ndg WHERE OrderID = @nOrderID Giảm giá trị cột TotalAmount dịng liệu bảng ORDERDETAILS bị xóa CREATE TRIGGER [ORDERDETAILS_DELETE] ON [dbo].[ORDERDETAILS] FOR DELETE AS Khai bao bien DECLARE @Bien int, @nOrderID int, @nTTG money SET @Bien = @@rowcount IF @Bien = RETURN Giam gia tri cho cot TotalAmount table ORDERS SELECT @nOrderID = OrderID, @nTTG = SUM(Quantity* UnitPrice) FROM DELETED GROUP BY OrderID UPDATE ORDERS SET TotalAmount = TotalAmount -@Nttg WHERE OrderID = @nOrderID Thay đổi giá trị cột TotalAmount cột Quantity, UnitPrice bảng ORDERDETAILS bị thay đổi CREATE TRIGGER [ORDERDETAILS_UPDATE] ON [dbo].[ORDERDETAILS] FOR UPDATE AS Khai bao bien DECLARE @Bien int, @NewTTG money, @OldTTG money SET @Bien = @@rowcount IF @Bien = RETURN IF UPDATE (Quantity) OR UPDATE (UnitPrice) BEGIN Lay gia tri moi Quantity*UnitPrice Ỉ bien ThS Đỗ Thị Minh Phụng Trang Hệ quản trị CSDL SQL Server SELECT @NewTTG = Quantity * UnitPrice FROM INSERTED Lay gia tri cu Quantity*UnitPrice Ỉ bien SELECT @OldTTG = Quantity * UnitPrice FROM DELETED Cap nhat gia tri TotalAmount UPDATE ORDERS SET TotalAmount = TotalAmount + (@NewTTG-@OldTTG) IF @@ERROR 0 BEGIN PRINT 'TTG ko thay doi' ROLLBACK TRAN END ELSE PRINT 'TTG da thay doi' END 2.3 Sửa trigger Chọn server group Ỉ chọn server Chọn Databases Æ chọn database chứa table có định nghĩa trigger Æ click Tables Trong khung trình bày đối tượng table có định nghĩa trigger database Ỉ click phải chuột tên table muốn sửa trigger Ỉ chọn All Tasks Ỉ chọn Manage Triggers … Tại mục Name, chọn tên trigger Thay đổi nội dung trigger in mục Text Click Check Syntax để kiểm tra lỗi cú pháp ThS Đỗ Thị Minh Phụng Trang 10 Hệ quản trị CSDL SQL Server 2.4 Xóa trigger Chọn server group Ỉ chọn server Chọn Databases Æ chọn database chứa table có định nghĩa trigger Æ click Tables Trong khung trình bày đối tượng table có định nghĩa trigger database Ỉ click phải chuột tên table muốn xóa trigger Ỉ chọn All Tasks Ỉ chọn Manage Triggers … Tại mục Name, chọn tên trigger muốn xóa Click Delete ThS Đỗ Thị Minh Phụng Trang 11 Hệ quản trị CSDL SQL Server Xác nhận xóa 2.5 Bài tập Lưu ý: thứ tự ưu tiên kiểm tra ràng buộc liệu CONSTRAINT kiểm tra trước TRIGGER Do đó, muốn TRIGGER thực phải tạm thời tắt hoạt động CONSTRAINT cú pháp lệnh sau: ALTER TABLE ten_bang NOCHECK CONSTRAINT ALL Tạo trigger xóa liệu tự động bên bảng liệu bên bảng cha bị xóa a Tạm thời tắt CONSTRAINT bảng ORDERDETAILS b Viết trigger DELETE bảng ORDERS cho xóa OrderID trigger tự động xóa OrderID có liên quan bên bảng ORDERDETAILS Khi thơng báo hình lệnh PRINT cho người dùng biết xóa dịng bảng ORDERDETAILS c Sau xóa thử OrderID 10249 bảng ORDERS xem kết thực Tạo trigger kiểm tra tồn liệu bên bảng liệu bên bảng cha bị xóa a Viết trigger DELETE bảng PRODUCTS cho xóa ProductID trigger phải kiểm tra tồn ProductID có liên quan bên bảng ORDERDETAILS Khi ProductID có tồn bảng ORDERDETAILS thơng báo khơng thể xóa Ngược lại thơng báo xóa ProductID b Sau xóa ProductID sau: 25 70 xem kết thực Tạo trigger kiểm tra tồn khóa ngoại bên bảng cha liệu bên bảng thêm vào a Tạm thời tắt CONSTRAINT bảng ORDERS b Viết trigger INSERT bảng ORDERS cho thêm dòng liệu vào bảng ORDERS phải kiểm tra cột khóa ngoại: cột CustomerID bảng CUSTOMERS, ThS Đỗ Thị Minh Phụng Trang 12 Hệ quản trị CSDL SQL Server EmployeeID bảng EMPLOYEES c Viết trigger INSERT bảng ORDERDETAILS cho thêm dòng liệu vào bảng ORDERDETAILS phải kiểm tra cột khóa ngoại: cột OrderID bảng ORDERS, ProductID bảng PRODUCTS Tạo trigger tính tốn tự động a Trong bảng PRODUCTS chèn thêm cột có tên Total_Quantity với kiểu INT b Sử dụng lệnh UPDATE để tính lại giá trị cho cột Total_Quantity biết giá trị cho cột tổng số lượng hàng hóa bảng ORDERDETAILS c Viết trigger INSERT bảng ORDERDETAILS dùng để tăng giá trị tự động cho cột Total_Quantity bảng PRODUCTS sau dòng liệu hợp lệ lưu vào bảng ORDERDETAILS (có thể quay lại trigger câu 3.c để viết tiếp mà không cần tạo trigger) d Viết trigger DELETE bảng ORDERDETAILS dùng để giảm giá trị tự động cho cột Total_Quantity bảng PRODUCTS sau dịng liệu bị xóa bảng ORDERDETAILS e Viết trigger UPDATE bảng ORDERDETAILS dùng để cập nhật giá trị tự động cho cột Total_Quantity bảng PRODUCTS sau dòng liệu bị thay đổi bảng ORDER DETAILS f Trong bảng ORDERS có cột tên TotalAmount Viết trigger cần thiết để giá trị cột cập nhật tự động Biết giá trị cột tổng trị giá OrderID ThS Đỗ Thị Minh Phụng Trang 13 ... pháp 2.2.2 Tạo trigger sử dụng T-SQL 2.2.2.1 Tạo trigger loại INSERT TRIGGER Khái niệm Trigger loại insert tự động thi hành câu lệnh bên có thao tác insert xảy table mà gắn INSERT TRIGGER dùng... bảng phát sinh tự động trigger loại INSERT TRIGGER Bảng dùng để lưu trữ thơng tin dịng liệu trước đưa vào bảng liệu SQL 2.2.2.2 Tạo trigger loại DELETE TRIGGER Khái niệm Loại trigger dùng để kiểm... table có nhiều trigger Câu lệnh CREATE TRIGGER định nghĩa với mệnh đề FOR UPDATE, FOR INSERT, FOR DELETE Các câu lệnh chứa bên trigger khơng có khác với stored procedure Các trigger thực thi