Chương 11 View và Các Con Trỏ
Mục đích:
Hoàn tất chương này, bạn có thể
Định nghĩa view
Hiểu được các ưu điểm của View
Tạo View
Sửa đổi View
Xoá view
Định nghĩa con trỏ và quá trình tạo con trỏ
Hiểu rõ View chỉ mục và View phân tán
Nắm vững quá trình thực thi con trỏ
Nhận về dữ liệu từ con trỏ theo hàng
Giới thiệu
Trong chương trước, chúng ta đã được học về các chỉ mục. Chúng ta cũng đã hiểu rõ về các kiểu
chỉ mục cùng với các đặc trưng hoàn chỉnh và duy nhất. Chúng ta cũng đã có những kiến thức về
các tác vụ như xem, xoá các chỉ mục.
Các câu truy vấn được sử dụng để truy xuất dữ liệu từ một bảng. Chúng được thực hiện trực tiếp
trên dữ liệu thực lưu trữ trong bảng. Thay vì việc truy vấn và xử lý dữ liệu trực tiếp trong các
bảng, SQL Server hỗ trợ các bảng ảo để biểu diễn các dữ liệu hiện có theo một cách mới. Các
bảng ảo hỗ trợ các chức năng tương tự như các bảng vật lý. Dữ liệu có thể được đọc, thêm mới và
sửa đổi trong các bảng giả lập. Các bảng như vậy được gọi là View.
Trong cơ sở dữ liệu quan hệ, các tác vụ được thực hiện trên tập hợp các hàng của bảng, trả về bởi
lệnh SELECT. Một số ứng dụng như các ứng dụng tương tác và trực tuyến không thể làm việc
hiệu quả với toàn bộ tập hợp dữ liệu trả về. Những ứng dụng này cần một kỹ thuật để xử lý dữ
liệu trên một hàng hoặc một khối lượng nhỏ các hàng tại một thời điểm. Con trỏ là sự mở rộng
của tập hợp kết quả trả về mà cung cấp kỹ thuật này. Trong chương này, chúng ta sẽ nghiên cứu
chi tiết về view và các con trỏ.
11.1 View
View là một cách thức để xem các dữ liệu từ một hay nhiều bảng trong cơ sở dữ liệu. View là
một bảng ảo, bảng ảo được tạo ra như một tập con của các cột hay các hàng từ một hay nhiều
bảng khác nhau. Đồng thời, nó cũng có thể bao gồm tất cả các hàng và các cột . Tuy nhiên, một
view không tồn tại như một tập hợp của các giá trị dữ liệu lưu trữ trong cơ sở dữ liệu. Các dòng
và cột đến từ các bảng tham chiếu trong chuỗi truy vấn. Dữ liệu được hiển thị trực tiếp từ bảng
ngay tại thời gian thực thi.
Một view có tác dụng như một bộ lọc dữ liệu trên các bảng có địa chỉ trong các truy vấn. Các truy
vấn này khai báo một view có thể dựa trên một hay nhiều bảng, hay từ những view khác, từ cơ sở
dữ liệu hiện tại hay cơ sở dữ liệu khác.
Hình 11.1 mô tả một view đã được tạo ra như thế nào. Xem xét các bảng, bảng A và bảng B và
một view được tạo ra từ 2 bảng trên. Tất cả các cột hoặc các cột đã được chọn từ các bảng trên
144 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
đều có thể được gộp trong view. Hình 11.1 chỉ ra một view được tạo ra với cột A và B từ bảng A
và cột B1,C1,D1 từ bảng B
A B C A B B1 C1 D1
Figure 11.1: View
View thường được sử dụng để:
Lọc các dòng từ bảng
Bảo vệ dữ liệu nhạy cảm khỏi những người dùng không được phép
Làm giảm sự phức tạp của cơ sở dữ liệu
Tách các cơ sở dữ liệu khác nhau ở dạng vật lý vào một cơ sở dữ liệu đơn nhất ở dạng
logic.
11.1.1 Ưu điểm của View
Việc sử dụng view mang lại cho người sử dụng và các nhà phát triển một số thuận lợi sau:
Thuận lợi của View đối với người sử dụng cuối
• Dễ dàng để hiểu được kết quả
Trong khi tạo ra những view, tên cột có thể được thay đổi sao cho có nghĩa hơn, vì vậy
nó làm cho người sử dụng có thể dễ dàng hiểu được cột này biểu diễn cái gì. Việc thay
đổi tên cột trong view không tác động đến tên cột trong bảng mà view tham chiếu đến.
• Dễ dàng để thu được dữ liệu mong muốn
Có nhiều người biết rất ít về SQL, các câu lệnh SQL trở nên khó khăn đối với họ khi họ
muốn tạo ra các truy vấn phức tạp từ nhiều bảng khác nhau. Bởi vậy, view được tạo ra
cho việc truy cập dữ liệu từ nhiều bảng khác nhau, nó giúp người sử dụng dễ dàng trong
việc truy cập sở dữ liệu.
Thuận lợi của View đối với những nhà phát triển
• Dễ dàng hạn chế việc mất mát dữ liệu
Một nhà phát triển có thể muốn giấu những thông tin trong một số cột hoặc một số dòng
nào đó. Bằng việc sử dụng view, người sử dụng có thể được cách truy cập linh hoạt tới
những dữ liệu mà họ muốn, trong khi vẫn duy trì được bảo mật đối với những dữ liệu
khác trong cùng một bảng hoặc trong các bảng khác nhau. Để làm việc này, View được
145 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
A1 B1 C1 D1
View - Table A & Table B
Table A
Table B
thiết lập ngăn chặn việc truy cập các cột không được phép, các cột này sẽ bị ẩn đối với
người sử dụng.
• Dễ dàng bảo trì các ứng dụng
Chúng ta dễ dàng soát lỗi của View hơn là soát lỗi của nhũng truy vấn. Dò tìm lỗi trong
từng bước của mỗi một quá trình trong một View là dễ dàng bởi tất cả các bước đều là
một phần của View.
11.1.2 Tạo mới View
Câu lệnh T-SQL CREATE VIEW được sử dụng để tạo ra một view. Cú pháp là:
CREATE VIEW <Ten_View> AS <Câu lệnh Select>
Ví dụ , để tạo một View trong cơ sở dữ liệu pups nó bao gồm chi tiết về những nhân viên cho nhà
xuất bản “ New Moon Books”, câu lệnh như sau:
CREATE VIEW NewMoon_employee AS
Select emp_id, fname, minit, lname, hire_date
FROM employee e, publishers p
WHERE e.pub_id =p.pub_id AND pub_name=’New Moon Books’
Một View đã được tạo ra, một câu lệnh SELECT có thể được thực thi để xem các hàng của View.
SELECT * FROM NewMoon_employee
Hình 11.2 hiển thị nội dung của View.
View và con trỏ 146
Figure 11.2: Hiển thị nội dung của một View
11.1.3 Các nguyên tắc khi tạo View
Có một số các nguyên tắc phải tuân theo trong khi tạo View
View chỉ có thể được tạo trong cơ sở dữ liệu hiện tại.
Tên một View tương tự như tên một bảng bởi vì nó phải dễ dàng để nhớ và có sự liên
kết (không có khoảng trắng giữa các kí tự). Nó phải theo các quy ước đặt tên để đảm
bảo sự đồng nhất.
Một View có thể được xây dựng dựa vào các View khác. SQL SERVER cho phép các
View được lồng vào nhau tới 32 mức (cấp). Mỗi một View có thể bao gồm tới 1024
cột từ một hay nhiều bảng hoặc từ nhiều View khác.
Những giá trị mặc định, những quy tắc và bẫy lỗi không thể được liên kết với View.
View không thể đánh chỉ mục.
Các bảng tạm thời không thể tham gia vào View
Khai báo View được lưu giữ lại ngay cả khi các bảng liên quan bị loại bỏ.
Câu truy vấn để khai báo View không thể bao gồm các mệnh đề ORDER BY,
COMPUTE, COMPUTE BY hoặc từ khóa INTO.
11.1.4 Sửa đổi dữ liệu thông qua View
Tương tự như trong các bảng, các câu lệnh INSERT/UPDATE/DELETE có thể được đưa vào
trong View. Kết quả thay đổi ở View chính là sự thay đổi dữ liệu trong bảng cơ sở. Một View có
thể được sử dụng để thay đổi dữ liệu trong bảng với điều kiện:
View phải bao gồm ít nhất một bảng nằm trong mệnh đề FROM của phần khai báo View,
điều đó có nghĩa là View không thể chỉ có một biểu thức.
Không có tất cả các hàm sau (AVG, COUNT, SUM, MIN, MAX, GROUPING) hoặc
GROUP BY, UNION, DISTINCT hoặc mệnh đề TOP trong danh sách được chọn. Tuy nhiên,
tất cả các hàm đó có thể được sử dụng trong chuỗi truy vấn con được khai báo trong mệnh đề
FROM với điều kiện là các giá trị nhận được, được sinh ra từ nhóm các hàm trên không bị
thay đổi.
View không có các cột nhận được từ trong danh sách chọn. Các cột nhận được này là kết quả
của tập hợp các cột chuẩn bởi bất cứ thứ gì hơn là một cột biểu thức đơn giản, ví dụ như việc
sử dụng các hàm, hay toán tử thêm hoặc xóa.
Câu lệnh INSERT, UPDATE và DELETE bắt buộc phải theo một tiêu chuẩn nhất định trước khi
chúng tham chiếu đến View có thể cập nhật. Câu lệnh UPDATE và INSERT có thể tham chiếu
đến View (có thể cập nhật) chỉ khi nếu chúng thay đổi dữ liệu chỉ trong một bảng của các bảng cơ
sở của View. Câu lệnh DELETE có thể tham chiếu đến View cập nhật được chỉ khi nếu View đó
bao gồm chính xác một bảng trong mệnh đề FROM.
11.1.5 Xóa View
Sau khi một View được sử dụng xong, nó có thể bị xóa để giải phóng vùng nhớ. Việc xóa một
View không tác động đến các bảng cơ sở mà View tham chiếu đến. Câu lệnh xóa một View là:
DROP VIEW Ten_view
Ten_view chính là tên của một view đã có trong cơ sở dữ liệu. Ví dụ, câu lệnh sau sẽ xóa View
có tên NewMoon_employee
147 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
DROP VIEW NewMoon_employee
11.2 View chỉ mục
View chỉ mục đã được giới thiệu trong SQL Server 2000 và chỉ được hỗ trợ trong phiên bản
Enterprise Edition (Phiên bản Standard và Personal cho phép bạn tạo chỉ mục trên một View
nhưng trình tối ưu hoá truy vấn sẽ không sử dụng view chỉ mục ở trong phần truy vấn). Đến tận
gần đây khái niệm của việc đánh chỉ mục một View vẫn còn vô lý, bởi việc đánh chỉ mục dữ liệu
ảo (dữ liệu không tồn tại) vẫn còn mơ hồ không rõ ràng. Một View là một bảng ảo, nó không có
bất kì dữ liệu thật nào của chính nó. Nó cho phép bạn truy cập đến dữ liệu hiện thời ở trong
những bảng cơ sở. Những View chỉ mục tăng cường khả năng thực hiện các truy vấn phức tạp
một cách mạnh mẽ.
SQL Server 2000 có View chỉ mục, tương tự như Materialized View của Oracle. Những lợi thế của
kiểu view này là nó cung cấp một cơ chế tìm kiếm rất nhanh chóng để lấy ra thông tin của một
view một cách liên tục. Chỉ mục đầu tiên được tạo ra trong một View chỉ mục phải là một chỉ
mục duy nhất loại clustered. Mỗi khi chỉ mục đầu tiên được tạo ra, kéo theo một số chỉ mục loại
non-clustered có thể được tạo ra.
Tốt nhất chúng ta nên xây dưng View chỉ mục trên dữ liệu không thường xuyên cập nhật, bởi vì
việc duy trì view có chi phí cao hơn việc duy trì một chỉ mục của bảng. Nếu view chỉ mục được
tạo ra trên những dữ liệu cập nhật thường xuyên thì chi phí để duy trì dữ liệu trong view chỉ mục
có thể làm giảm những ưu điểm của việc sử dụng view chỉ mục.
Bạn có thể cải thiện khả năng thực thi của những kiểu truy vấn dưới đây bằng việc sử dụng View
chỉ mục:
• Quá trình tập hợp hoặc kết nối rất nhiều hàng.
Bạn không thể cải thiện khả năng thực thi của những kiểu truy vấn dưới đây bằng việc sử dụng
View chỉ mục:
• Các công việc chứa một số lượng lớn các tác vụ cập nhật đối với cơ sở dữ liệu
• Những hệ thống OLTP với nhiều tác vụ ghi dữ liệu.
• Các câu truy vấn không chứa toán tử tập hợp hoặc kết nối.
• Các tập hợp dữ liệu có khoá ở mức yếu tố cao. (Một mức yếu tố cao chỉ ra rằng khoá nắm
giữ nhiều giá trị. Trong trường hợp khoá là duy nhất, mỗi khoá đều có một giá trị khác nhau
thì mức yếu tố ở giá trị cao nhất có thể).
Có một số giới hạn cho việc xây dựng các chỉ mục trên View:
Tuỳ chọn SCHEMABINDING phải được sử dụng với view. Tuỳ chọn này kết nối các bảng
được xác định trong định nghĩa view. Mỗi khi các đối tượng cần thiết trong một view được
giới hạn, không ai có thể thay đổi nó. Để thay đổi những đối tượng như vậy, đầu tiên bạn phải
xoá bỏ khung giới hạn của view. SCHEMABINDING không cho phép bất cứ một tác vụ sửa
đổi nào đối với các đối tượng bên dưới, do đó tránh được việc view trở thành “mồ côi".
Ví dụ, trong trường hợp một bảng mà một view được tạo ra rồi bị xoá bởi một ai đó. Nếu
view là Schema Bound, bạn có thể tránh được những điều rắc rối như vậy.
View và con trỏ 148
Nếu view tham chiếu đến một chức năng nào đó do người dùng định nghĩa, nó phải sử dụng
tuỳ chọn SCHEMABINDING.
View có thể chỉ bao gồm các chức năng do người dùng định nghĩa và các bảng tham chiếu và
nó không thể tham chiếu đến bất kỳ view nào khác.
Các đối tượng được tham chiếu trong view phải trong cùng một cơ sở dữ liệu với view.
Các đối tượng được tham chiếu trong view phải sử dụng kiểu tên quy ước gồm hai phần
chẳng hạn như as dbo.Employees (dbo là tên người sở hữu và Employees là đối tượng cơ sở
dữ liệu), Jones.UDFName (Jones là tên người sở hữu và UDFName là đối tượng cơ sở dữ
liệu). Một view có thể chỉ bao gồm các đối tượng được tạo ra bởi người sở hữu view đó. Ví
dụ, một view được tạo bởi người sử dụng dbo có thể chứa các đối tượng của một mình dbo.
Bạn phải sử dụng tuỳ chọn ARITHABORT khi tạo chỉ mục.
Ghi chú: Tuỳ chọn arithabort được dùng để huỷ các truy vấn trong trường hợp tràn bộ đệm
hoặc gặp lỗi chia cho 0. Tuỳ chọn này giúp cho việc dừng các thao tác số học trong trường hợp
có lỗi. Do đó nó có tên là ARITHABORT.
Chúng ta cùng tạo một View chỉ mục sử dụng các bảng Customer, Product, Order và
Order_Details từ cơ sở dữ liệu Northwind.
CREATE VIEW CustOrdProd_view
WITH SCHEMABINDING
AS
SELECT cust.CompanyName, ord.OrderID, ord.OrderDate,
orddet.ProductID, prod.ProductName, orddet.Quantity,
orddet.UnitPrice
FROM dbo.Customers AS cust
INNER JOIN dbo.Orders AS ord
ON cust.CustomerID = ord.CustomerID
INNER JOIN dbo.[Order Details] AS orddet
ON ord.OrderID = orddet.OrderID
INNER JOIN dbo.Products AS prod
ON orddet.ProductID = prod.ProductID
Trong view này, chúng ta phải sử dụng tuỳ chọn SCHEMABINDING và quy ước đặt tên hai phần
cho các đối tượng tham chiếu bởi view.
Bạn có thể kiểm tra view bằng một câu lệnh SELECT đơn giản:
SET STATISTICS IO ON
SET STATISTICS TIME ON
SELECT * FROM CustOrdProd_view
Kết quả thể hiện trên hình 11.3. Tuỳ chọn statistics time được sử dụng để xem số lượng các thao
tác đĩa được sinh ra bởi T-SQL. Tuỳ chọn statistics io được sử dụng để hiển thị số mili giây cần
thiết để chuyển đổi, dịch và thực hiện mỗi lệnh.
149 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
Hình 11.3
SQL Server 2000 tạo một lược đồ thực thi trước khi thi hành một câu truy vấn. Lược đồ này mô
tả các chỉ mục và đường dẫn, SQL Server sẽ sử dụng để lấy các dữ liệu cần thiết cho truy vấn.
Hình 1 hiển thị kết quả của việc nhấn nút trên lược đồ thực thi của câu truy vấn. Hình 11.4 hiển
thị chi phí thực hiện lược đồ cho truy vấn này.
View và con trỏ 150
Shows Estimated
Execution Plan
Hình 11.4
Cú pháp TSQL ở trên đã tạo ra một view mà nó có thể được đánh chỉ mục. Khi chúng ta tạo chỉ
mục, chỉ mục đầu tiên được tạo trên view phải vừa là clustered , vừa có tính năng duy nhất.
SET ARITHABORT ON
CREATE UNIQUE CLUSTERED INDEX Index_CustOrdProd
ON CustOrdProd_view (CompanyName, OrderID, ProductID)
Bạn có thể kiểm tra bằng một lệnh SELECT đơn giản:
SELECT * FROM CustOrdProd_view
Kết quả của view thể hiện trên hình 11.5.
151 Thiết kế cơ sở dữ liệu và thực hành với SQL Server
Hình 11.5
Hình 11.6 hiển thị chi phí thực hiện lược đồ cho truy vấn này.
View và con trỏ 152
Hình 11.6
showplan cho view thông thường và view chỉ mục thể hiện rằng chỉ mục không được sử dụng lúc
nào. Tác dụng của một view chỉ mục chỉ rõ ràng trên các bảng mà chứa một số lượng lớn các
hàng. Trong các bảng với một số lượng ít các hàng, hiệu suất của một view chỉ mục và view
thông thường sẽ gần như tương đương nhau.
11.3 View Phân Tán (Distributed Partitioned views)
SQL Server 2000 hỗ trợ đặc tính “Distributed Partitioned Views (DPV)” hay tạm dịch là View
phân tán. Tính năng này cho phép phân chia va phân tán dữ liệu theo chiều ngang tới nhiều server
và cơ sở dữ liệu và làm cho chúng ta cảm thấy vẫn như một cơ sở dữ liệu thống nhât. DPV cũng
được giới thiệu trong SQL Server 7.0, với các giới hạn về việc thực hiện các lệnh Select. Việc
phân chia view cũng đã có trong SQL Server 7 nhưng SQL Server 2000 cho phép chúng được
phân tán thông qua nhiều máy khác nhau. Các bảng đã phân chia được phân tán qua nhiều server.
Vì thế, mỗi server cần truy nhập tới mọi server khác. Do đó, bạn cần cài đặt cầu hình tất cả các
server như các server liên kết (linked servers).
Ví dụ, xét rằng bạn muốn phân chia các bảng Customers và Orders trên ba server được gọi là
Server1, Server2 and Server3. Để liên kết các server này, Server1 cầm được liên kết với Server2
và Server3; Server2 cần được liên kết với Server3 và Server1; và Server3 cần được liên kết với
153 Thiết kế cơ sở dữ liệu và thực hành với SQL Server