Mặc dù bạn có một lựa chọn là kiểm tra hợp lệ các tài liệu XML đối với một lược đồ trước khi chèn, các tri-gơ có thể được sử dụng để thực hiện việc xác nhận hợp lệ này một cách tự động m
Trang 1Các tùy chọn mới cho tính toàn vẹn và xác nhận hợp lệ dữ liệu XML trong
DB2 V9.5
Xác nhận hợp lệ thông qua ràng buộc kiểm tra (CHECK), hỗ trợ trigger
Manoj Sardana, Kỹ sư phần mềm, IBM
Madhavi Kaza, Kỹ sư phần mềm, IBM
Tóm tắt: DB2® của IBM® cho Linux®, UNIX® và Windows® đã đưa công
nghệ pureXML® vào trong phiên bản 9 Công nghệ này cho phép bạn lưu trữ dữ liệu XML dưới dạng nguyên sinh của nó, như vậy duy trì được cấu trúc phân cấp
và cho phép bạn truy vấn nó bằng cách sử dụng SQL/XML và XQuery Cũng như với các dữ liệu quan hệ, khả năng để bảo đảm sự toàn vẹn của dữ liệu XML được lưu trong DB2 là bắt buộc Tuy nhiên, các phương thức và cơ chế để đảm bảo tính toàn vẹn của dữ liệu XML khác một chút so với các phương thức đảm bảo tính toàn vẹn dữ liệu quan hệ truyền thống Trong bài viết này bạn sẽ tìm hiểu về tính toàn vẹn của dữ liệu XML trong bối cảnh DB2 và khám phá các tùy chọn khác nhau để đảm bảo tính toàn vẹn mà bạn có trong các kịch bản khác nhau
Mục lục
Tính toàn vẹn của XML
Đăng ký lược đồ XML và xác nhận hợp lệ
Xác nhận hợp lệ thông qua các ràng buộc kiểm tra trên các cột XML
Bắt buộc xác nhận hợp lệ tự động thông qua các tri-gơ
Trang 2 Sử dụng các vị từ IS VALIDATED và IS NOT VALIDATED trong các câu lệnh SELECT
Băm nhỏ các giá trị của XML vào các cột quan hệ
Tóm tắt
Tính toàn vẹn của XML
Tính toàn vẹn của dữ liệu XML trong cơ sở dữ liệu của DB2 có thể được xem xét bằng nhiều cách Ở một mức độ rất cơ bản, trước khi chèn một giá trị XML vào một bảng, có thể bạn muốn bảo đảm rằng các kiểu dữ liệu của các giá trị của các phần tử khác nhau là đúng Ở một mức độ sâu hơn, bạn có thể muốn có những ràng buộc chẳng hạn như tính duy nhất của một giá trị của phần tử, số bội
(multiplicity) của một phần tử, hoặc hạn chế đối với các giá trị của một phần tử Khi dữ liệu XML được lưu giữ cùng với các dữ liệu quan hệ, bạn có thể muốn đảm bảo rằng một số giá trị của phần tử trong XML cũng xuất hiện trong các cột quan hệ Lý do của điều này có thể là các cột này là một phần của khóa chính hoặc khóa ngoài
DB2 cung cấp một số giải pháp khác nhau cho các yêu cầu về tính toàn vẹn này Mặc dù bạn có một lựa chọn là kiểm tra hợp lệ các tài liệu XML đối với một lược
đồ trước khi chèn, các tri-gơ có thể được sử dụng để thực hiện việc xác nhận hợp
lệ này một cách tự động mà không cần để người sử dụng biết Bạn có thể sử dụng ràng buộc kiểm tra để buộc người sử dụng phải kiểm tra hợp lệ giá trị của XML với một lược đồ đã đăng ký trước Trước khi bạn sử dụng bất kỳ lựa chọn nào trong các tùy chọn này, thì cần phải đăng ký một lược đồ XML với cơ sở dữ liệu
Để lưu trữ một giá trị nút vào một cột quan hệ nhằm duy trì tính đơn nhất, bạn có thể băm nhỏ các giá trị nút thích hợp thành một kiểu dữ liệu quan hệ bằng cách sử dụng một hàm SQL/XML và chèn nó vào một cột quan hệ Trong các phần sau, chúng ta sẽ nói về tất cả các tùy chọn này một cách chi tiết với các mã ví dụ
Trang 3
Đăng ký lược đồ XML và xác nhận hợp lệ
Lược đồ XML được sử dụng để định nghĩa cấu trúc của một tài liệu XML, các phần tử của nó, các thuộc tính của nó và kiểu dữ liệu của các phần tử hoặc của các thuộc tính Hơn nữa, nó cho phép bạn định nghĩa các giá trị phần tử mặc định và các hạn chế với các phần tử, chẳng hạn như số bội hay là tính đơn nhất Một khi đã được định nghĩa, nó có thể được sử dụng để xác nhận tính hợp lệ cho các tài liệu XML đối với lược đồ XML đã xác định Liệt kê 1 cho thấy ví dụ của lược đồ
"employee" (nhân viên) Chúng ta sẽ sử dụng lược đồ này trong các phần sau của bài viết này
Liệt kê 1 Lược đồ Employee
Trang 4<xs:element name = "name" type = "xs:string"/>
<xs:element name = "dept" type = "xs:string"/>
<xs:element name = "salary" type = "xs:double"/>
<xs:element name = "designation" type = "xs:string"/> <xs:element name = "date-of-join" type = "xs:date"/>
<xs:element name = "address">
<xs:complexType>
<xs:sequence>
<xs:element name = "street" type = "xs:string"/> <xs:element name = "city" type = "xs:string"/> <xs:element name = "state" type = "xs:string"/> <xs:element name = "country" type = "xs:string"/> <xs:element name = "zipcode" type = "xs:string"/> </xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
Trang 5<xs:attribute name = "id" type = "xs:string" use = "required"/>
Liệt kê 2 Đăng ký lược đồ XML
REGISTER XMLSCHEMA http://posample.org FROM employee.xsd as
employee;
COMPLETE XMLSCHEMA employee;
Trang 6Sau khi lược đồ được đăng ký thành công và được gán một tên quan hệ, bạn có thể
sử dụng nó để xác nhận hợp lệ
Xác nhận hợp lệ là một quá trình kiểm tra xem các cá thể tài liệu có đáp ứng kiểu cấu trúc, kiểu dữ liệu và các ràng buộc nội dung đã chỉ rõ trong lược đồ XML hay không Quá trình xác nhận hợp lệ loại bỏ dữ liệu không hợp lệ trước khi nó được chèn vào cơ sở dữ liệu Nó đảm bảo rằng các tài liệu XML tuân thủ các quy tắc được lược đồ XML cung cấp và đúng khuôn dạng
Trong DB2, việc kiểm tra hợp lệ các tài liệu XML theo các lược đồ XML là tùy chọn Ví dụ, nếu các tài liệu XML nhận được từ một nguồn đáng tin cậy, thì việc xác nhận hợp lệ có thể không cần thiết Ngược lại, nếu các tài liệu XML nhận được từ một nguồn không biết rõ, hãy cẩn thận kiểm tra hợp lệ các tài liệu XML
đó để duy trì tính toàn vẹn dữ liệu
Hàm XMLVALIDATE được sử dụng để xác nhận hợp lệ các tài liệu XML trước khi chèn hoặc cập nhật các tài liệu XML vào một bảng Như đã đề cập ở phần trước, các lược đồ XML phải được đăng ký trước khi sử dụng chúng để xác nhận hợp lệ
Hàm XMLVALIDATE xác nhận hợp lệ tài liệu hoặc ngầm ẩn hoặc tường minh
Xác nhận hợp lệ ngầm: Tài liệu XML chỉ rõ vị trí của lược đồ và vùng tên
bằng cách sử dụng thuộc tính XSi: schemaLocation hoặc chỉ rõ riêng chỉ vị trí lược đồ bằng cách sử dụng thuộc tính XSi:
noNamespaceSchemaLocation DB2 sử dụng các giá trị đầu vào này và tìm kiếm các bảng danh mục nhằm tìm ra lược đồ XML cần thiết để xác nhận hợp lệ tài liệu XML Ví dụ: Bạn có thể chèn tài liệu XML sau đây vào một bảng hiện có có tên là EMPLOYEE, bảng này có hai cột, một cột có kiểu
dữ liệu integer và cột thứ hai có kiểu XML
Trang 8<zipcode>560001</zipcode>
</address>
</employee>')
Xác nhận hợp lệ tường minh: Tài liệu XML xác định một cách tường minh
mã nhận dạng SQL hoặc thông tin vùng tên và vị trí của lược đồ XML bằng cách sử dụng mệnh đề ACCODING TO XMLSCHEMA ID trong hàm XMLVALIDATE Dưới đây là một ví dụ về xác nhận hợp lệ tường minh
Liệt kê 4 Xác nhận hợp lệ tường minh
INSERT INTO employee VALUES (101,
Trang 9VALIDATED
Trang 10
Xác nhận hợp lệ thông qua các ràng buộc kiểm tra trên các cột XML
Hãy xem xét một kịch bản mà bạn muốn kết buộc một tập hợp các lược đồ XML với một cột XML Tuy nhiên, trách nhiệm xác nhận hợp lệ giá trị XML thuộc về ứng dụng Trong trường hợp này, quản trị viên cơ sở dữ liệu có thể đặt một ràng buộc kiểm tra trên cột XML và đảm bảo rằng ứng dụng sử dụng một trong những lược đồ được đăng ký trước để xác nhận hợp lệ Thao tác này cũng sẽ bảo đảm rằng tài liệu XML luôn luôn được xác nhận hợp lệ
Các ràng buộc kiểm tra là các ràng buộc trên các cột bảng được sử dụng để hạn chế người dùng phải theo một điều kiện kiểm tra cụ thể Khi chèn hay cập nhật trên một cột, thì bạn chỉ có thể thực hiện các thao tác này trên bảng nếu các điều kiện kiểm tra được đánh giá là đúng
Tạo một bảng với ràng buộc kiểm tra trên một cột XML
Các ràng buộc kiểm tra trên dữ liệu XML cung cấp cho bạn khả năng xác định các ràng buộc trên một cột XML dưới dạng kiểm tra hợp lệ theo lược đồ XML, để đảm bảo rằng chỉ các tài liệu XML đã được xác nhận hợp lệ đối với các lược đồ thích hợp được lưu trữ trong cột Điều này đảm bảo sự nhất quán của thông tin được lưu trữ trong cột XML Nó cũng mang lại khả năng định nghĩa các biểu thức XML trên các giá trị XML khi chúng được xác nhận hợp lệ theo một tập hợp các lược đồ định nghĩa trước Các vị từ IS VALIDATED hoặc IS NOT VALIDATED cùng với mệnh đề ACCORDING TO XMLSCHEMA có thể được sử dụng để kiểm tra xem tài liệu được xác nhận hợp lệ hay chưa đối với các lược đồ đã chỉ định
Các ràng buộc kiểm tra cũng có thể liệt kê một tập hợp các lược đồ Điều này có nghĩa là tài liệu XML có thể được xác nhận hợp lệ đối với một trong các lược đồ
Trang 11XML được chỉ định Bằng cách cung cấp nhiều lược đồ trong ràng buộc kiểm tra, bạn có được sự linh hoạt, sử dụng một trong các lược đồ cho việc xác nhận hợp lệ
để giúp đỡ trong việc liên kết nhiều lược đồ với một cột XML cụ thể Ví dụ trong liệt kê 5 cho thấy cách chỉ định rõ một lược đồ đơn lẻ trong một ràng buộc kiểm tra như thế nào
Liệt kê 5 Tạo ràng buộc kiểm tra trên một cột XML
CREATE TABLE customer (cust_id INTEGER NOT NULL,
info XML CONSTRAINT val_check
CHECK(info IS VALIDATED ACCORDING TO XMLSCHEMA ID
customer))
Ví dụ trên tạo ra một ràng buộc kiểm tra trên cột INFO, cột này có kiểu XML Ràng buộc kiểm tra đảm bảo rằng tài liệu được xác nhận hợp lệ đúng với lược đồ customer (khách hàng) (giả định rằng lược đồ customer đã được đăng ký trong DB2) Bạn lưu ý rằng ràng buộc kiểm tra đánh giá xem tài liệu XML có được xác nhận hợp lệ hay không Nó không thực hiện việc xác nhận hợp lệ thực tế
Ví dụ trong liệt kê 6 cho thấy có thể liệt kê nhiều lược đồ khi tạo một ràng buộc kiểm tra cụ thể
Trang 12Liệt kê 6 Tạo ràng buộc kiểm tra trên một cột XML với nhiều lược đồ
CREATE TABLE customer (cust_id INTEGER NOT NULL,
cust_info XML CONSTRAINT val_check
CHECK (cust_info IS VALIDATED ACCORDING TO XMLSCHEMA IN (ID registered_customers, ID online_customers, ID regular_customers)))
Câu lệnh chèn trong ví dụ sau không thực hiện được bởi vì nó xác nhận hợp lệ tài liệu XML theo một lược đồ không được quy định tại mệnh đề ràng buộc kiểm tra
Liệt kê 7 Vi phạm ràng buộc kiểm tra
INSERT INTO customer
VALUES (1001, XMLVALIDATE(XMLPARSE(cust_info)
ACCORDING TO XMLSCHEMA ID cust))
Trang 13Chèn các giá trị XML thông qua các khung nhìn
Các tài liệu XML cũng có thể được chèn thông qua các khung nhìn vào các bảng
cơ sở tương ứng của chúng Khi một thao tác chèn được thực hiện trên một cột XML thông qua khung nhìn, thì ràng buộc kiểm tra của bảng cơ sở được áp dụng với tài liệu XML, và chỉ khi nó thỏa mãn ràng buộc kiểm tra thì tài liệu XML được chèn vào bảng Ví dụ dưới đây tạo ra một khung nhìn trên hai bảng có các tài liệu XML
Liệt kê 8 Chèn tài liệu XML thông qua các khung nhìn
CREATE TABLE distributor (dist_id INTEGER, dist_info XML
CONSTRAINT dist_check
CHECK(dist_info IS VALIDATED ACCORDING TO XMLSCHEMA
ID distributor))
CREATE VIEW cust_dist_view(id, details) AS
(SELECT id, info FROM customer
Trang 14UNION ALL
SELECT dist_id, dist_info FROM distributor)
INSERT INTO cust_dist_view VALUES (id,
XMLVALIDATE(XMLPARSE(details)
ACCORDING TO XMLSCHEMA ID distributor))
INSERT INTO cust_dist_view VALUES (id,
XMLVALIDATE(XMLPARSE(details)
ACCORDING TO XMLSCHEMA ID registered_customers))
Câu lệnh CREATE VIEW tạo ra một khung nhìn của bảng khách hàng (customer)
và bảng nhà phân phối (distributor) Câu lệnh chèn đầu tiên chèn dữ liệu vào bảng DISTRIBUTOR nếu dữ liệu XML được lưu giữ trong bảng DETAILS (Các chi tiết) là hợp lệ đối với lược đồ XML DISTRIBUTOR Câu lệnh chèn thứ hai này chèn dữ liệu vào bảng CUSTOMER nếu dữ liệu XML được lưu giữ trong bảng DETAILS là hợp lệ đối với lược đồ XML REGISTERED_CUSTOMERS
Sự phụ thuộc của ràng buộc kiểm tra và khung nhìn vào lược đồ XML
Trang 15Các ràng buộc kiểm tra và các khung nhìn được tạo ra ở bên trên một bảng với các ràng buộc kiểm tra trên một cột XML sẽ phụ thuộc vào các lược đồ XML Nếu lược đồ bị hủy bỏ, thì các ràng buộc kiểm tra không thể kiểm tra xác nhận hợp lệ đối với lược đồ đã bị hủy bỏ và vì thế hoạt động chèn thành công
Liệt kê 9 Sự phụ thuộc của ràng buộc kiểm tra và khung nhìn vào lược đồ XML
DROP XSROBJECT customer
DROP VIEW cust_dist_view
INSERT INTO customer VALUES(201, cust_info)
INSERT INTO cust_dist_view VALUES (202, details);
Các hoạt động chèn vào bảng CUSTOMER và khung nhìn CUST_DIST_VIEW sẽ thành công mà không cần bất kỳ xác nhận hợp lệ nào
Trang 16
Bắt buộc xác nhận hợp lệ tự động thông qua các tri-gơ
Trong tình huống mà một ứng dụng được phát triển theo một cách mà rất khó thay đổi câu lệnh chèn để thực hiện một việc xác nhận hợp lệ tường minh, quản trị viên
cơ sở dữ liệu có thể viết một tri-gơ, câu lệnh này sẽ được kích hoạt trên mọi hoạt động chèn hoặc cập nhật để thực hiện xác nhận hợp lệ một cách tự động
DB2 9.5 đã đưa vào khái niệm xác nhận hợp lệ tự động ép buộc các văn bản XML
gửi đến bằng cách sử dụng tri-gơ BEFORE Bất cứ khi nào một hoạt động chèn hoặc cập nhật được thực hiện trên một bảng, thì việc xác nhận hợp lệ tự động đảm bảo rằng các tài liệu XML được xác nhận hợp lệ đối với lược đồ XML được chỉ định Hoạt động xác nhận hợp lệ tự động này được thực hiện ở phần hành động của câu lệnh tri-gơ bằng cách sử dụng hàm XMLVALIDATE
Tạo ra câu lệnh tri-gơ BEFORE để ép buộc xác nhận hợp lệ tự động
Bất cứ khi nào một tài liệu XML được chèn hoặc được cập nhật trong một bảng thì câu lệnh tri-gơ được thi hành Phần hành động của câu lệnh tri-gơ bao gồm hàm XMLVALIDATE để xác nhận hợp lệ các tài liệu XML với lược đồ XML được chỉ định
Lấy ví dụ: Bảng nhân viên (employee) có chứa ID của nhân viên và các thông tin
về nhân viên đó Cột EMP_ID các ID nhân viên có kiểu dữ liệu integer, và cột INFO các thông tin về nhân viên có kiểu XML Cột INFO chứa thông tin của nhân viên như tên, chức vụ, mức lương, ngày gia nhập công ty, bộ phận công tác và các chi tiết liên hệ được mô tả trong một tài liệu XML Việc xác nhận hợp lệ tự động các tài liệu XML gửi đến có thể được áp đặt như sau
Liệt kê 10 Xác nhận hợp lệ thông tin về nhân viên bằng cách sử dụng câu lệnh tri gơ BEFORE
Trang 17CREATE TABLE employee (emp_id INTEGER, info XML);
CREATE TRIGGER val_trig NO CASCADE BEFORE INSERT on employee REFERENCING NEW AS n
FOR EACH ROW MODE DB2 SQL
Trang 18Lưu ý: Nếu câu lệnh tri-gơ thất bại khi xác nhận hợp lệ tài liệu XML, thì tài liệu không được chèn vào Nó cũng không trả lại bất kỳ thông báo lỗi nào
Sử dụng vị từ IS {NOT} VALIDATED trong mệnh đề WHEN
Luôn có khả năng là ứng dụng đã xác nhận hợp lệ tài liệu XML trước khi chèn nó nào Tuy nhiên, cũng có thể đã có một câu lệnh tri-gơ xác định thực hiện xác nhận hợp lệ tự động Trong tình huống như vậy thì việc xác nhận hợp lệ lại tài liệu XML một lần nữa chỉ mang lại thêm tải cho công việc
Trong trường hợp này, câu lệnh tri-gơ có thể được triển khai để trước tiên xác minh xem việc xác nhận hợp lệ đã được hoàn tất chưa Nếu đã hoàn tất, nó bỏ qua quá trình xác nhận hợp lệ bằng cách sử dụng mệnh đề WHEN ở bên trong thân câu lệnh tri-gơ Chỉ khi mệnh đề WHEN được đánh giá là true thì phần hành động của câu lệnh tri-gơ sẽ được thực thi Ví dụ sau minh họa việc sử dụng mệnh đề WHEN trong câu lệnh tri-gơ
Liệt kê 11 Sử dụng mệnh đề WHEN trong câu lệnh tri gơ BEFORE
UPDATE
CREATE TRIGGER val_trig NO CASCADE BEFORE UPDATE ON employee REFERENCING NEW AS n
FOR EACH ROW MODE DB2 SQL
WHEN (n.info IS NOT VALIDATED ACCORDING TO XMLSCHEMA ID