Chuẩn bị kỳ thi số 731 lấy chứng chỉ DBA (Quản trị cơ sở dữ liệu) DB2 9, Phần 3: Truy cập cơ sở dữ liệu

Hướng dẫn này dẫn dắt bạn qua các bước khác nhau cần có để quản lý một số đối tượng trong DB2®. Nó gồm thông tin tổng quát về chỉ mục, ràng buộc, tính toàn vẹn tham chiếu, và khung nhìn. Đây là bài thứ ba trong loạt bảy bài hướng dẫn mà bạn có thể sử dụng nhằm giúp chuẩn bị lấy chứng chỉ Quản trị Cơ sở dữ liệu DB2 9 dùng cho Linux®, UNIX® và Windows™ (Bài thi số 731).

George Baklarz, Giám đốc DB2, IBM

George Baklarz, B.Math, M.Sc (Comp Sci), là một quản lý viên trong nhóm hỗ trợ trước bán sản phẩm DB2. Ông có hơn 21 năm kinh nghiệm làm việc với DB2 và là đồng tác giả cuốn DB2 UDB Version 8.1 Database Administration Certification Guide ( Hướng dẫn thi lấy chứng chỉ quản trị cơ sở dữ liệu DB2, phiên bản 8.1) (Prentice-Hall, 2003), DB2 Version 8: The Official Guide (Chỉ dẫn cơ bản về phiên bản 8 của DB2) (Prentice-Hall, 2003), và cuốn Apache Derby -- Off to the Races (Apache Derby -- rời khỏi cuộc đua) (Prentice-Hall, 2005). Khi rảnh rỗi, ông tham gia giảng dạy về lý thuyết cơ sở dữ liệu tại trường đại học của Guelph và có mặt tại nhiều cuộc hội thảo, bao gồm cả International DB2 Users Group (Nhóm những người sử dụng DB2 trên thế giới)



18 12 2009

Trước khi bạn bắt đầu

Về loạt bài này

Nếu bạn đang chuẩn bị dự thi bài số 731 lấy chứng chỉ DB2 DBA, bạn đã đến đúng chỗ. Loạt bảy bài hướng dẫn chuẩn bị thi lấy chứng chỉ DB2 này gồm các khái niệm chính mà bạn cần biết để làm bài kiểm tra. Hãy làm bài tập ở nhà của bạn tại đây và hãy làm dịu bớt căng thẳng trong ngày kiểm tra đó.

Về tài liệu hướng dẫn này

Hướng dẫn này sẽ đưa bạn qua các bước khác nhau cần có để quản lý một số đối tượng trong DB2. Các chủ đề sau đây gồm:

  • Tạo các tác vụ DB2 bằng cách sử dụng công cụ GUI.
  • Tạo và quản lý các chỉ mục.
  • Tạo các ràng buộc trên bảng (ví dụ, RI, thông tin, tính duy nhất).
  • Tạo các khung nhìn trên các bảng.
  • Kiểm tra nội dung của các bảng danh mục hệ thống.
  • Áp đặt tính duy nhất của dữ liệu.

Đây là bài thứ ba trong loạt bảy bài hướng dẫn nhằm giúp bạn chuẩn bị thi lấy Chứng chỉ Quản trị Cơ sở dữ liệu DB2 9 dùng cho Linux, UNIX® và Windows™ (Bài thi số 731). Tư liệu trong hướng dẫn này trước tiên trình bày các mục tiêu trong Phần 3 của bài thi, có tiêu đề “Truy cập Cơ sở dữ liệu.” Bạn có thể xem các mục tiêu này tại địa chỉ trang web: http://www-03.ibm.com/certify/tests/obj731.shtml.

Việc cài đặt DB2 không nêu trong hướng dẫn này. Nếu bạn chưa cài đặt, chúng tôi hết sức khuyên bạn tải về và cài đặt một bản IBM DB2 9. Việc cài đặt DB2 sẽ giúp bạn hiểu nhiều khái niệm được trắc nghiệm trên bài thi lấy Chứng chỉ Quản trị Cơ sở dữ liệu DB2 9.

Các điều kiện tiên quyết

Do bạn đang đọc hướng dẫn này, rõ ràng là bạn muốn được học tập về các khía cạnh của việc quản trị DB2, hoặc có thể nâng cấp kỹ năng hiện tại của bạn để phản ánh các khía cạnh mới tìm thấy trong phát hành mới nhất của sản phẩm. Bạn cũng có thể quan tâm đến việc lấy chứng chỉ về quản trị DB2 và cần điểm lại những gì chúng tôi trình bày trong bài thi!

Dù lý do của bạn là gì đi nữa, vẫn có một vài điều bạn phải làm để nhận được nhiều nhất từ bài này và các hướng dẫn khác:

  1. Hãy lấy một bản DB2 9. Không có cái gì để thực hành, bạn sẽ không thể thử các ví dụ hoặc khám phá các đặc điểm khác nhau của sản phẩm.
  2. Lấy các hướng dẫn chuẩn bị bài thi Cơ sở về DB2 9. Các bài hướng dẫn này cho bạn một nền tảng cơ sở về DB2 và sẽ làm nó sáng tỏ hơn một số thuật ngữ được sử dụng trong hướng dẫn này. Có lẽ không phải là một ý tưởng tồi nếu bạn đã qua được bài kiểm tra đó trước khi thử bài này!
  3. Thực hành và thử các thứ của chính bạn. Trong khi hướng dẫn này cố gắng trình bày nhiều chủ đề mà bạn cần để nhận được chứng chỉ, không có gì đánh đổi được kinh nghiệm.
  4. Đọc tài liệu Quản trị DB2 (DB2 Administration). Chúng có thể cho bạn nhiều thứ bên trong về cách DB2 làm việc. Cũng có các nguồn thông tin khác về DB2 mà có thể tìm thấy ở phần cuối của hướng dẫn này (xem Tài nguyên).

Tạo các tác vụ DB2 bằng cách sử dụng các công cụ GUI

Trung tâm tác vụ DB2 (DB2 Task Center)

Một trong những công cụ DB2 được sử dụng để điều khiển cơ sở dữ liệu là Trung tâm Tác vụ. Trung tâm Tác vụ được sử dụng để chạy các tác vụ, hoặc tức khắc hoặc theo lịch, và thông báo cho con người về tình trạng của tác vụ đã hoàn tất.

Trung tâm Tác vụ gồm tất cả các chức năng thấy trong Trung tâm Kịch bản lệnh (Script Center) trong các phiên bản trước của DB2, cộng với các đặc điểm bổ sung mới. Một tác vụ là một kịch bản lệnh, cùng với các điều kiện thành công, lịch biểu, và các thông báo kết hợp với nhau. Bạn có thể tạo một tác vụ trong Trung tâm Tác vụ, tạo một kịch bản lệnh trong công cụ khác và lưu nó vào Trung tâm Tác vụ, nhập một kịch bản lệnh hiện hành, hoặc lưu các tuỳ chọn từ một hội thoại hoặc thủ thuật DB2 như thủ thuật Load. Một kịch bản lệnh có thể chứa các lệnh DB2, SQL, hoặc lệnh hệ điều hành.

Tạo các cơ sở dữ liệu công cụ

Để sử dụng Trung tâm Tác vụ, cần có danh mục công cụ. Danh mục công cụ chứa các thông tin về các tác vụ quản trị mà bạn lập cấu hình với các công cụ như vậy như Trung tâm Tác vụ và Trung tâm Điều khiển.

Danh mục công cụ có thể đã được tạo ra cho bạn khi bạn đã cài đặt DB2, nhưng trong trường hợp nó chưa sẵn có, bạn có thể tạo ra nó bằng cách sử dụng một lệnh DB2 hoặc trình đơn công cụ (tools menu).

Để tạo ra cơ sở dữ liệu công cụ từ dòng lệnh, mở một cửa sổ lệnh DB2 và chạy lệnh sau đây:

db2 create tools catalog cc create new database toolsdb

Để tạo ra cơ sở dữ liệu bằng cách sử dụng các thiết đặt công cụ, chọn Tools > Tools Settings > Scheduler Settings từ trong Trung tâm Điều khiển:

Bắt đầu Trung tâm Tác vụ

Bắt đầu Trung tâm Tác vụ với lệnh db2tc từ cửa sổ dòng lệnh, hoặc nhấn vào Trung tâm Tác vụ từ bất kỳ công cụ DB2 nào:

Ngoài ra, Trung tâm Tác vụ còn có thể khởi động từ trình đơn DB2 trong một môi trường Windows:

Một khi Trung tâm Tác vụ được khởi động, bạn có thể quản lý, tạo, và chạy các kịch bản lệnh.

Chức năng của Trung tâm Tác vụ

Đối với mỗi tác vụ, bạn có thể làm các việc sau:

  • Lập lịch biểu tác vụ.
  • Quy định điều kiện thành công và thất bại.
  • Quy định các hành động mà sẽ được thực hiện khi tác vụ này thực hiện thành công hoặc khi nó thất bại.
  • Quy định rõ địa chỉ email (gồm cả các địa chỉ nhắn tin) mà sẽ được thông báo đến, khi tác vụ này thực hiện thành công hoặc khi nó thất bại.

Bạn có thể chỉ rõ cách mã hoá có điều kiện (conditional coding) bằng cách tạo các hành động tác vụ. Mỗi hành động tác vụ gồm có một tác vụ và hành động sẽ được thực hiện về tác vụ đó. Ví dụ, tác vụ 1 có thể có các hành động tác vụ sau đây:

  • Nếu tác vụ 1 thành công, thao tác tác vụ A cho phép lập lịch biểu tác vụ 2.
  • Nếu tác vụ 1 thất bại, thao tác tác vụ B cho chạy tác vụ 3.

Bạn cũng có thể tạo ra một nhóm tác vụ mà kết hợp một số tác vụ trong một đơn vị logic của công việc. Khi nhóm tác vụ đáp ứng các điều kiện thành công hoặc thất bại mà bạn đã xác định, bất kỳ tác vụ kế tiếp cũng được chạy. Ví dụ bạn có thể kết hợp ba kịch bản lệnh sao lưu thành một nhóm tác vụ và sau đó quy định một việc sắp xếp lại như một tác vụ kế tiếp mà sẽ được thực hiện nếu tất cả các kịch bản lệnh sao lưu thực hiện thành công.

Tạo một tác vụ

Trung tâm Tác vụ có thể đòi hỏi tám bước để tạo ra một tác vụ:

  1. Mô tả và đặt tên tác vụ.
  2. Chọn một kịch bản lệnh.
  3. Xác định các tiêu chí thành công hoặc thất bại (các thuộc tính chạy).
  4. Nhóm các tác vụ.
  5. Lịch biểu tác vụ chạy.
  6. Thiết lập một mức thông báo.
  7. Chọn các thao tác tác vụ sau khi hoàn thành.
  8. Đặt bảo mật.

Các bước này được mô tả trong bảng điều khiển sau đây. Khi Trung tâm Tác vụ được khởi động, nó hiển thị tất cả các tác vụ mà hiện tại được xác định trong hệ thống:

Để tạo một tác vụ mới, nhấn chuột trái vào vùng liệt kê tác vụ, hoặc chọn Task > New từ trình đơn tại đỉnh của bàn điều khiển.

Việc này mở ra một cửa sổ cho phép bạn xác định tác vụ mà bạn muốn tạo.

Trung tâm Tác vụ được cập nhật với bất kỳ tác vụ mới nào mà bạn tạo ra. Lưu ý rằng các tuỳ chọn làm mới lại sẽ được thiết đặt ở một quãng thời gian hợp lý nếu bạn muốn xem bất kỳ thay đổi về các tác vụ mà đã có sẵn trong danh sách.

Mô tả và đặt tên tác vụ

Bảng mô tả tác vụ cho phép bạn xác định các đặc tính của chính tác vụ:

Trường Name (tên) gồm tên của tác vụ mà bạn đang tạo ra. Tên này có thể chứa bất kỳ ký tự nào, vậy tên mô tả có thể được sử dụng.

Kiểu trường báo cho DB2 biết kiểu của hành động mà tác vụ này đang thực hiện. Có bốn tuỳ chọn:

  • Kịch bản lệnh DB2: Tập lệnh này chạy các lệnh DB2, chúng có thể chứa SQL.
  • Kịch bản lệnh hệ điều hành: Lệnh hệ điều hành được gộp trong kiểu kịch bản lệnh này.
  • Kịch bản lệnh shell MVS: Kịch bản lệnh shell MVS thực hiện trong một môi trường chủ MVS hoặc z/OS. Kiểu tác vụ này cũng có thể gồm các lệnh JCL (Job Control Language - Ngôn ngữ Điều khiển Công việc).
  • Nhóm tác vụ: Nhóm tác vụ nhận một vài tác vụ và đặt chúng vào một nhóm được thực hiện cùng nhau.

Trường Description (mô tả) có thể chứa mô tả độ dài của tác vụ được tạo.

Trường Task Category (loại tác vụ) được sử dụng để phân loại kiểu của tác vụ đang được tạo ra. Đây là một trường tuỳ chọn, nhưng có thể rất hữu ích khi bạn cố gắng tìm một lệnh trước đó, hoặc nhóm các lệnh cùng nhau dựa theo mục đích của chúng. Nhấn vào nút chấm lửng lược (ellipsis) ở phần cuối của trường [...] để xem một danh sách các loại tác vụ được xác định:

Một tác vụ có thể có nhiều loại liên kết với nó. Các loại tác vụ sẵn có có thể được sử dụng để phân loại tác vụ bằng cách chọn loại tác vụ và sau đó nhấn nút >. Các loại tác vụ bổ sung có thể được tạo ra bằng cách gõ nhập một mục mới dưới New task category và nhấn >. Các loại này có thể được sử dụng để sắp xếp các tác vụ sẵn có trong chính cửa sổ tác vụ vào sau này.

Trường Run System (chạy hệ thống) cho biết hệ thống sẽ chạy các lệnh. Đây có thể là một hệ thống cục bộ (như trường hợp trong các hình mẫu) hoặc bất kỳ hệ thống ở xa nào mà đã được lên danh mục.

Tuỳ chọn DB2 Instance and Partition (cá thể và phân vùng DB2) cho phép bạn chọn ra thể hiện và vùng mà trên đó lệnh sẽ chạy. Tuỳ chọn phân vùng chỉ có ý nghĩa đối với các hệ thống có DPF (DB2 Partitioning Feature - đặc tính phân vùng DB2) đã được cài đặt. Trong trường hợp như vậy, tác vụ có thể chạy trên các phân vùng riêng trong cơ sở dữ liệu, chứ không phải là qua toàn bộ chúng.

Tất cả các trường, trừ trường mô tả và phân loại, cần được đưa dữ liệu vào để tác vụ được tạo ra.

Chọn một kịch bản lệnh

Bảng kịch bản lệnh chứa lệnh DB2 thực hoặc lệnh hệ điều hành mà bạn muốn chạy đối với cơ sở dữ liệu. Cửa sổ chính cho phép bạn gõ nhập lệnh hoặc sử dụng các thao tác cắt và dán để sắp đặt thông tin vào bảng này.

Nếu bạn đã tạo ra hoặc lưu một kịch bản lệnh trong một tệp bên ngoài, nhấn nút Import để nạp nó vào.

Nếu một kịch bản lệnh cần truy cập dữ liệu hoặc xuất thông tin ra đĩa, quy định rõ thư mục mặc định để DB2 biết vị trí để đặt hoặc tìm thông tin.

Cuối cùng, dấu kết thúc lệnh DB2 (DB2 statement terminator) tham chiếu đến ký tự mà sẽ được sử dụng để phân tách nhiều lệnh DB2. Theo mặc định, đây là dấu chấm phẩy (;), nhưng bạn có lẽ cần thay đổi cái này nếu bạn đang tạo ra các hàm DB2, bộ khởi động (trigger), hoặc bất kỳ lệnh SQL PL nào. Các đối tượng DB2 này sử dụng dấu chấm phẩy như là dấu tách lệnh của chúng, do đó một dấu tách DB2 khác sẽ được sử dụng (ký hiệu đô la ($) hoặc ký hiệu a móc (@) là hai ký hiệu được sử dụng phổ biến).

Các thuộc tính chạy

Bảng Run Properties (các thuộc tính chạy) được sử dụng để xác định các tiêu chí thành công hay thất bại của tác vụ. Bạn có thể báo cho kịch bản lệnh dừng lại khi có bất kỳ mã trả lại khác không (dừng thực hiện tại mã trả lại đầu tiên báo thất bại) hoặc xác định một tập các điều kiện mã trả lại.

Nếu một tác vụ có thể trả lại nhiều mã trả lại mà được coi là thành công, bạn cần xác định một bộ mã thành công. Để hiển thị một danh sách các bộ mã, nhấn vào trường Success code set.

Trong trường hợp không có bộ mã thành công nào được hiển thị, hoặc nếu không có mã nào của chúng phù hợp với các yêu cầu của bạn, hãy tạo ra mã của riêng bạn bằng cách nhấn New.

Bạn có thể tạo ra bộ mã thành công của chính bạn, chúng có thể chứa nhiều giá trị mã trả lại. Sau đó bạn có thể sử dụng bộ mã thành công này cho tác vụ hiện tại của bạn, và sử dụng lại nó cho các tác vụ bổ sung mà bạn tạo ra sau đó. Ví dụ đặc biệt này tạo ra một bộ mã thành công cho mã trả lại 0 (zero return code), như minh họa trên đây. Bạn có thể chỉ cần sử dụng hộp đánh dấu chọn mã trả lại mặc định trên bảng thứ nhất để đạt được cùng một mục đích.

Nhóm các tác vụ

Sử dụng chức năng nhóm để chạy hoặc lập lịch biểu với nhau một số lớn các tác vụ. Thay cho việc tạo một tác vụ lệnh, xác định một nhóm tác vụ. Ngay sau khi kiểu tác vụ này được xác định, phiếu Group được kích hoạt và cửa sổ sau đây mở ra.

Trên phiếu này, bạn có thể thêm tất cả các tác vụ mà bạn muốn chạy như là một bộ phận của nhóm này. Trong ví dụ này, hai tác vụ đã được thêm vào nhóm. Sau khi bạn đã xác định tất cả các tác vụ, lập lịch biểu nhóm và thiết đặt bất kỳ điều kiện thành công hoặc thất bại nào như bạn sẽ thực làm bằng một tác vụ riêng.

Lập lịch biểu các tác vụ

Một khi xác định kịch bản lệnh của bạn và chạy các đặc tính của tác vụ, hãy xác định lịch biểu về thời gian nó sẽ chạy. Bạn không phải tạo ra một lịch biểu cho tác vụ của mình, nhưng để chạy nó bạn cần phải lập lịch biểu riêng cho nó hoặc như một bộ phận của một nhóm.

Phiếu lịch biểu (schedule tab) gồm ngày và thời gian lúc mà lệnh được coi là sẽ chạy.

Bạn có thể quy định rằng lệnh này chạy một lần, hoặc nhiều lần dựa trên một lịch biểu hoặc trên một danh sách của các lịch biểu đã lưu. Nếu bạn muốn chạy nhiều tác vụ vào cùng một ngày hoặc chạy đồng thời, có lẽ đơn giản hơn là tạo ra một bản ghi lịch biểu và sử dụng lịch này cho mỗi tác vụ, chứ không phải lần nào cũng tạo lại nó.

Thiết đặt thông báo

Phiếu thông báo được sử dụng để báo cho DB2 biết nơi gửi mã hoàn thành khi tác vụ kết thúc. Việc này không gửi đi kết quả thật của tác vụ, mà chỉ là mã trả lại.

Nhiều thông báo có thể được gửi đi đối với một tác vụ riêng. Các thông báo này có thể dựa trên:

  • Tác vụ thành công: Khi tác vụ thực hiện thành công, một thông báo có thể được gửi đi.
  • Tác vụ thất bại: Khi tác vụ không thực hiện thành công, một thông báo có thể được gửi đi.
  • Bất kỳ điều kiện nào: Dù kết quả gì đi nữa thì một thông báo cũng được gửi đi.

Ngoài mức độ thông báo, bạn cũng có thể quy định cách mà thông báo được gửi đi. Trung tâm tác vụ có thể thông báo các liên hệ hoặc sắp đặt thông tin trong Sổ ghi chép (Journal) (xem Sổ ghi chép). Danh sách liên hệ gồm một tập những người sử dụng mà bạn có thể gửi đến một trang hoặc các thông báo qua thư điện tử (email notifications).

Lưu ý rằng nếu bạn muốn gửi các thông báo cho người sử dụng, bạn phải thiết lập một một máy chủ SMTP trên máy của bạn. Không có khả năng này thì không thể gửi thông báo.

Thông báo tự nó có thể được tuỳ biến để chứa bất kỳ văn bản nào mà bạn muốn. Một số biến kiểu ký hiệu (symbolic variables) có sẵn trong văn bản, được sử dụng để trả lại thông tin về tác vụ:

  • &Categories: Các loại liên kết với tác vụ.
  • &Completionstatus: Trạng thái hoàn thành của tác vụ. Giá trị này phụ thuộc vào bộ mã thành công liên kết với tác vụ.
  • &Description: Mô tả của tác vụ.
  • &Duration: Khoảng thời gian chạy hệ thống để hoàn tất tác vụ từ lúc bắt đầu đến khi kết thúc.
  • &End: Ngày và thời gian tác vụ hoàn tất.
  • &Howinvoked: Phương thức sử dụng để gọi ra tác vụ.
  • &Name: Tên tác vụ.
  • &Owner: Tên của chủ nhân tác vụ.
  • &Returncode: Mã trả lại cuối cùng của tác vụ.
  • &Runpartitions: Phân vùng mà tác vụ chạy trên đó.
  • &Runsystem: Tên của hệ thống mà tác vụ chạy trên đó.
  • &Schedulersystem: Tên của hệ thống mà tác vụ được lập lịch biểu trên đó.
  • &Start: Ngày và thời gian tác vụ bắt đầu chạy.
  • &Type: Kiểu tác vụ (nghĩa là, nó là một kịch bản lệnh DB2, một kịch bản lệnh hệ điều hành, một kịch bản lệnh shell MVS, một kịch bản lệnh JCL, hay là một nhóm).
  • &Userid: Mã nhận dạng người sử dụng cho tác vụ đó.

Thiết đặt các thao tác tác vụ

Phiếu các hành động tác vụ (task actions tab) xác định cái mà xảy ra với tác vụ sau khi nó đã thực hiện xong.

Có ba hành động tác vụ khả dĩ có thể xảy ra đối với một tác vụ, tuỳ thuộc vào việc nó có hay không:

  • Thực hiện thành công.
  • Thất bại tại bất kỳ bước nào.
  • Tạo ra bất kỳ kết quả nào (thành công hay thất bại).

Khi bất kỳ điều kiện nào trong số các điều kiện này được đáp ứng, tác vụ có thể thực hiện một số hành động. Nó có thể:

  • Chạy tác vụ khác.
  • Lập lịch biểu một tác vụ nữa.
  • Vô hiệu hoá lịch biểu của một tác vụ.
  • Xóa chính nó.

Phần các hành động tác vụ cho phép bạn xâu chuỗi nhiều tác vụ, mỗi tác vụ phụ thuộc vào sự thực hiện thành công của tác vụ trước đó. Ví dụ, bạn có thể chắc chắn rằng một bảng đã được tạo ra thành công trước khi bạn xác định các chỉ mục trên nó.

Thiết đặt bảo mật

Phiếu bảo mật (security tab) cho phép bạn cấp các đặc quyền đọc, viết, và thực hiện (chạy) cho những người dùng khác đối với tác vụ được tạo ra. Điều này có thể hữu ích khi bạn có một số người dùng khác nhau tạo ra và bảo trì các tác vụ. Trong trường hợp như vậy, hẳn là dễ dàng hơn khi tạo ra một nhóm người dùng được phép quản lý các tác vụ này, chứ không phải là cấp từng người quyền truy cập đến tác vụ.

Danh sách tác vụ

Một khi bạn đã tạo ra tác vụ, nó sẽ được hiển thị trong chính trình đơn tác vụ.

Các mục trong trình đơn tác vụ được hiển thị theo phạm trù tổng quát. Đây cũng là trường phân loại (category field) mà bạn đã điền dữ liệu khi tạo ra tác vụ. Bằng cách sử dụng các phân loại, bạn làm cho nó dễ dàng hơn khi tìm và quản lý các tác vụ này.

Một tác vụ sẽ bị loại bỏ khỏi danh sách này nếu nó bị người sử dụng xóa vật lý, hoặc nếu một trong các hành động được giao là xóa chính nó sau khi thực hiện xong. Nếu màn hình tự động được làm mới, tác vụ cuối cùng sẽ biến mất khi nó đã chạy xong. Để xác định trạng thái của một tác vụ sau khi nó đã hoàn tất, sử dụng Sổ ghi chép, cái mà chúng ta sẽ thảo luận trong mục tiếp theo.

Sổ ghi chép (Journal)

Sổ ghi chép ghi lại một số sự kiện bên trong nhân cơ sở dữ liệu (database engine). Những sự kiện này gồm:

  • Lịch sử tác vụ: Hiển thị kết quả của tác vụ đã chạy.
  • Lịch sử cơ sở dữ liệu: Hiển thị bất kỳ hoạt động bảo trì nào đối với một cơ sở dữ liệu.
  • Thông báo: Danh sách các thông báo lỗi đã được cơ sở dữ liệu tạo ra.
  • Nhật ký thông báo: Gồm các thông báo đã được tạo ra bởi Trung tâm Sức khoẻ (Health Center) hoặc các cảnh báo trong hệ thống.

Sổ ghi chép có thể được khởi động từ Trung tâm Điều khiển hoặc từ trình đơn công cụ.

Sổ ghi chép cũng có thể được khởi động từ trong nhóm chương trình DB2. Màn hình ban đầu được hiển thị như dưới đây.

Tất cả các mục trong danh sách là các tác vụ (hoặc nhóm các tác vụ) đã thực hiện. Để lấy nhiều chi tiết hơn trên một tác vụ cụ thể, nhấn đúp lên tác vụ đó. Ví dụ, nhấn tác vụ cuối cùng trong danh sách được minh họa trong hình trên đây cho thấy báo cáo của tác vụ đó.

Trang kết quả cho bạn biết tác vụ thành công hay không và cũng chứa bất kỳ thông báo nào được tạo ra bởi tác vụ đó. Có ba phiếu phụ cung cấp thêm thông tin về tác vụ được thực hiện. Phiếu thứ hai cung cấp các thông tin về kịch bản lệnh được thực hiện:

Phiếu thứ ba trong báo cáo tác vụ hiển thị kết quả vật lý do tác vụ tạo ra. Kết quả chạy SQL thể hiện trong hình dưới đây. Lưu ý rằng SQL phải chạy lệnh connect (kết nối) với đúng cơ sở dữ liệu để nó chạy thành công. Không có kết nối thì tác vụ sẽ không biết hoạt động trên cơ sở dữ liệu nào.

Cuối cùng, phiếu cuối cùng cho biết các thao tác tiếp theo được thực hiện khi tác vụ hoàn tất. Trong trường hợp này, tác vụ tự xóa chính nó khi đã chạy thành công.

Tóm tắt

Trung tâm Tác vụ cho phép bạn xác định tác vụ mà có thể chạy nhiều lệnh khác nhau, bao gồm:

  • Các lệnh DB2.
  • Các lệnh Hệ điều hành.
  • Các lệnh MVS shell hoặc JCL.
  • Các nhóm của các kiểu lệnh nói trên.

Các tác vụ có thể được lập lịch biểu để làm việc vào những lúc đặc biệt, và có thể thông báo cho những người dùng khác về thành công hay thất bại của họ. Ngoài ra, một tác vụ cũng có thể làm cho tác vụ khác được lên lịch biểu, đột xuất, hoặc xóa bỏ.


Tạo và quản lý các chỉ mục

Giới thiệu

Chỉ mục là một thành phần quan trọng trong bất kỳ cơ sở dữ liệu nào. Mặc dù mô hình quan hệ không đòi hỏi các chỉ mục để chạy các truy vấn hoặc tính toán các kết quả, nhưng người dùng đầu cuối của bạn sẽ vui hơn nếu bạn tạo ra một số chỉ mục trên các bảng thường hay sử dụng!

Chỉ mục là các đối tượng vật ký liên kết với các bảng đơn. Bất kỳ bảng đã được lưu trữ hay bảng mô tả tạm thời đều có thể có nhiều chỉ mục xác định trên nó. Bạn không thể xác định một chỉ mục trên một khung nhìn.

Chỉ mục được sử dụng vì hai lý do chủ yếu:

  • Để đảm bảo tính duy nhất của các giá trị dữ liệu.
  • Để cải thiện hiệu năng truy vấn SQL.

Chỉ mục có thể dùng để truy cập dữ liệu theo một trật tự được sắp xếp một cách nhanh chóng và tránh cho tác vụ phải tiêu tốn thời gian sắp xếp dữ liệu trong lưu trữ tạm thời. Chỉ mục cũng có thể được tạo ra trên các cột tính toán để bộ tối ưu hoá có thể lưu lại thời gian tính toán bằng cách sử dụng chỉ mục thay cho việc tính toán. Chỉ mục được bảo trì tự động bởi DB2 khi dữ liệu được chèn vào, cập nhật, và xóa.

Chỉ mục được tạo ra như thế nào

Với tư cách là một DBA, bạn phải có kiến thức về cách tạo chỉ mục. Mặc dù chỉ mục chỉ là một thành phần tuỳ chọn (nhưng lại rất quan trọng!) của bất kỳ cơ sở dữ liệu nào, chúng đôi khi thay bạn tạo ra một cách tự động. Nếu bạn không lập kế hoạch trước cho chỉ mục, bạn không thể có đủ tài nguyên để tạo hoặc bảo trì chúng.

Chỉ mục có thể được tạo ra thông qua việc sử dụng lệnh CREATE INDEX (tạo chỉ mục). Tuy nhiên, chỉ mục cũng được tạo tự động nếu bạn tạo một bảng gồm một cột với một thuộc tính UNIQUE (duy nhất), nếu có ràng buộc tham chiếu đến bảng, hoặc nếu một bảng được xác định theo các thuộc tính kích thước (đa chiều - multidimensional). Tất cả các điều kiện này đòi hỏi chỉ mục để áp đặt tính duy nhất trong bảng, và để đảm bảo hiệu năng khả dĩ. Hãy tưởng tượng rằng nếu cơ sở dữ liệu phải rà quét toàn bộ bảng mỗi khi nó cần kiểm tra xem một giá trị có phải là duy nhất hay không!

Ngoài các lệnh SQL tạo chỉ mục, nhiều thủ thuật khác có sẵn trong Trung tâm Điều khiển DB2 giúp xác định chỉ mục nào sẽ phù hợp nhất trong một hoàn cảnh cho trước.

Các vấn đề với chỉ mục

Câu hỏi đầu tiên bạn sẽ đặt ra khi tạo ra một chỉ mục là, “Cái nào sẽ cho tôi hiệu năng tốt nhất?”. Bạn sẽ tạo ra một chỉ mục trên mỗi cột trong một bảng để đảm bảo hiệu năng tốt? Hoặc bạn sẽ chỉ tạo một chỉ mục mà cho người sử dụng trực tiếp truy cập đến dữ liệu?

Các chỉ mục chiếm không gian trên hệ thống của bạn. Chúng có thể thường trú trong cùng một không gian bảng với bảng bạn đang lập chỉ mục hoặc một không gian bảng chỉ mục riêng biệt. Do có các giới hạn vật lý về kích thước của không gian bảng, bạn không thể có đủ không gian để tạo ra tất cả các thứ bạn cần.

Việc cập nhật chỉ mục phải mất thời gian. Bất cứ khi nào bạn chèn, cập nhật, hoặc xóa các bản ghi, DB2 phải thay đổi tất cả các chỉ mục ứng với tác động của hành động của bạn. Như vậy, việc tạo ra 15 chỉ mục trên bảng ưa thích của bạn, sẽ tạo ra 15 cập nhật chỉ mục mỗi khi bạn thay đổi dữ liệu. Trong trường hợp này, thay vì đảm bảo hiệu năng tốt hơn, các chỉ mục của bạn sẽ làm thời gian trả lời lâu hơn.

Cuối cùng, chỉ mục có lẽ không thích hợp với các cột mà có ít giá trị (phần tử số thấp). Một phương thức lập chỉ mục thay thế (multidimensional clustering – cụm đa chiều, hay MDC) có thể phù hợp hơn.

Chỉ mục đặt ở đâu?

Trước khi bạn quyết định tạo ra một số chỉ mục, bạn phải nhanh chóng ôn lại các khái niệm về không gian bảng.

Các bảng và chỉ mục là được đặt vào không gian bảng. Một không gian bảng được sử dụng như một lớp (layer) nằm giữa cơ sở dữ liệu và các thùng chứa đối tượng dữ liệu bảng thực tế.

Thùng chứa là một dụng cụ lưu trữ vật lý. Nó có thể được xác định bởi một tên thư mục, một tên thiết bị, hoặc một tên tệp. Một thùng chứa được gán cho một không gian bảng và một không gian bảng có thể chắp nối nhiều thùng chứa. Khả năng để có nhiều thùng chứa gán cho một không gian bảng tránh các hạn chế của hệ điều hành về lượng dữ liệu mà một thùng chứa có thể có. Quan hệ giữa toàn bộ các đối tượng này được minh họa trong biểu đồ dưới đây.

Mặc dù một bảng là đối tượng cơ sở được đặt vào một không gian bảng, bạn phải nhận thức được các đối tượng bổ sung trong hệ thống DB2 và cách chúng được ánh xạ đến một không gian bảng.

Lưu trữ bảng và chỉ mục

Vậy tại sao lại quan tâm đến lệnh CREATE TABLE (tạo bảng) khi điều bạn thật sự muốn thực hiện là tạo một số chỉ mục? Khó khăn với việc thay thế chỉ mục là ở chỗ nó phụ thuộc vào cách mà bảng được xác định.

Nếu một bảng được tạo ra không có bất kỳ liên quan nào đến vị trí, nó sẽ tạo trong không gian hệ thống mặc định, cùng với bất kỳ chỉ mục được tạo cho nó. Điều này có nghĩa là không gian bảng USERSPACE1 sẽ nhanh chóng lấp đầy các bảng và chỉ mục của bạn, do cả hai được lưu trữ tại cùng một nơi.

Ngay cả khi bạn sắp đặt một cách chu toàn các bảng của bạn trong các không gian bảng riêng biệt, bạn vẫn có thể có vấn đề, do các chỉ mục sẽ được tạo ra ở cùng một nơi. Bạn cần quy định vị trí của các chỉ mục của bạn!

Tạo bảng

Khi bạn tạo một bảng, bạn có thể sử dụng một tuỳ chọn để quy định rõ không gian bảng -- hoặc các không gian bảng -- trong đó bảng và chỉ mục sẽ được đặt:

CREATE TABLE TEST (
  column 1 definition, column 2 definition, ...
) IN <tablespace name> INDEX IN <index space name>

Lệnh này cho bạn tuỳ chọn xác định vị trí bảng được tạo ra, cùng với chỉ mục. Nếu bạn không quy định rõ một không gian bảng chỉ mục riêng biệt, các chỉ mục được tạo ra ở cùng một không gian bảng với bảng. Bạn không có tuỳ chọn nào tạo ra các chỉ mục trong một không gian bảng khác sau khi bảng đã được tạo. Bài học của chuyện này là: trước tiên hãy đặt kế hoạch, khi tạo ra các chỉ mục của bạn!

Nếu bạn dự định phân vùng các bảng của bạn (phân vùng phạm vi), bạn có thêm sự linh hoạt trong việc đặt mỗi chỉ mục của bảng đó sang không gian bảng của chính nó. Tuỳ chọn này chỉ dùng cho các bảng đã được phân vùng.

Tạo các chỉ mục

Bây giờ bạn đã biết nơi các chỉ mục của bạn đang được tạo ra, đã đến lúc kiểm tra lại lệnh CREATE INDEX. Đây là cú pháp lệnh cơ bản:

CREATE <UNIQUE> INDEX <index name> ON <table name>
  (
  column 1 <ASC | DESC> ,
  column 2 <ASC | DESC> ...
  )

Thuộc tính UNIQUE báo cho DB2 biết rằng chỉ mục đó phải áp đặt tính duy nhất cho tất cả các giá trị được chèn. Nếu tìm thấy một giá trị trùng lặp trong khi có lệnh UPDATE (cập nhật) hay INSERT (chèn), một lỗi sẽ được trả lại cho ứng dụng.

Các cột được liệt kê trong các dấu ngoặc được sử dụng để tạo ra chỉ mục. Các từ khoá tuỳ chọn ASC (tăng dần) và DESC (giảm dần) báo cho DB2 biết cách xếp thứ tự các giá trị này trong chỉ mục của chính nó. Các tuỳ chọn này rất hữu ích khi bạn chạy lệnh SQL có sắp xếp các kết quả, giống như:

SELECT * FROM EMPLOYEE
ORDER BY EMPNO DESC

Nếu chỉ mục đã được tạo ra trước đó theo thứ tự giảm dần, DB2 có thể sử dụng chỉ mục để trả lại các giá trị theo chuỗi sắp xếp, chứ không thực hiện riêng bước sắp xếp. Điều này có thể tiết kiệm đáng kể thời gian trên tập kết quả (answer set) lớn. Nếu tập kết quả được sắp xếp trong cả thứ tự tăng dần và giảm dần, có thể có lợi hơn khi thêm đoạn ALLOW REVERSE SCANS (cho phép rà soát ngược) vào cuối lệnh CREATE INDEX. Việc này báo cho DB2 biết dùng con trỏ phụ (additional pointers) trong chỉ mục để kết chuỗi ngược và xuôi có hiệu quả trên các bản ghi. Đoạn ALLOW REVERSE SCANS bây giờ là mặc định đối với bất kỳ chỉ mục nào được tạo trong DB2 9, nhưng các bản phát hành trước đây sẽ cần phải gộp vào tùy chọn này để cho phép truy cập tăng dần và giảm dần trên cùng một chỉ mục.

Gộp vào các cột bổ sung trong một chỉ mục

DB2 có khả năng thêm các cột bổ sung vào chỉ mục mà bạn đang tạo ra. Lệnh CREATE INDEX cho phép người sử dụng quy định các cột mà không phải là bộ phận của chỉ mục thật, nhưng được giữ lại trong bản ghi chỉ mục vì lý do hiệu năng.

CREATE UNIQUE INDEX IX ON EMPLOYEE (EMPNO) INCLUDE (LASTNAME,FIRSTNME)

Chỉ mục phải là UNIQUE (duy nhất) đối với các cột được gộp vào chỉ mục. Khi chỉ mục được tạo ra, các cột bổ sung được thêm vào các giá trị chỉ mục. Chỉ mục không sử dụng các giá trị này để sắp xếp hoặc quyết định tính duy nhất, nhưng có thể sử dụng chúng khi làm thoả mãn một truy vấn SQL. Ví dụ, lệnh SELECT (chọn) sau đây sẽ không cần đọc các hàng dữ liệu thật:

SELECT LASTNAME, FIRSTNME FROM EMPLOYEE WHERE EMPNO < '000300'

Việc kiểm tra Visual Explain đối với lệnh này sẽ xác nhận việc sử dụng chỉ mục để nhận tập các kết quả.

Có nhiều hoàn cảnh đặt dữ liệu trong chỉ mục sẽ trợ giúp hiệu năng. Tuy nhiên phải chú ý không được sử dụng quá nhiều cột; nếu bạn làm điều này thì kích thước của chỉ mục có thể bắt đầu đạt tới kích thước vật lý của chính dữ liệu đó.

Chỉ mục xếp nhóm

Một chỉ mục xếp nhóm là một chỉ mục được DB2 sử dụng để thử và chèn các bản ghi lên cùng một trang như các bản ghi khác với các giá trị khoá chỉ mục tương tự. Nếu không có không gian trên trang đó, sẽ dự định đưa bản ghi vào các trang xung quanh.

Lợi ích của việc có một chỉ mục nhóm là ở chỗ các lệnh SELECT tìm kiếm một giá trị riêng (hoặc dãy các giá trị) trên một khoá có thể nhanh chóng tìm ra tập các trả lời mà không cần rà soát toàn bộ bảng. Các giá trị khoá tương tự sẽ được đặt trên cùng một trang dữ liệu sao cho chỉ cần đọc một phần trong toàn bộ bảng. Ngoài ra, nhu cầu tổ chức lại bảng cũng có thể giảm bằng cách sử dụng một chỉ mục cụm.

Để bảo đảm sẵn sàng có đủ không gian cho các hàng mới trên trang hiện hành, từ khoá PCTFREE sẽ được sử dụng trong khi tạo bảng để để lại một số không gian sẵn sàng cho việc chèn và cập nhật sau này. Một khi bảng đã được nạp vào, giá trị PCTFREE có thể được giảm bớt để cho phép nhiều bản ghi hơn được thêm vào trang hiện hành.

Để tạo chỉ mục xếp nhóm trên bảng, hãy thêm từ khoá CLUSTER vào cuối lệnh CREATE INDEX, như:

CREATE INDEX DEPTS_IX ON EMPLOYEE(WORKDEPT) CLUSTER

Từ khoá PCTFREE cũng có thể được dùng trong việc tạo chỉ mục. Hãy quy định giá trị PCTFREE cao hơn vào lúc tạo chỉ mục, rồi đặt nó ở giá trị thấp hơn để cho phép các bản ghi được chèn vào chỉ mục không tách trang chỉ mục. Điều này đặc biệt hữu ích trong môi trường giao dịch cao, nơi có nhiều hoạt động chèn và xóa. Tuy nhiên, nếu cơ sở dữ liệu của bạn chủ yếu nhằm tải làm việc truy vấn (query workloads), có thể có lợi hơn nếu đặt nhiều dữ liệu có thể được vào trang chỉ mục. Trong trường hợp này, đặt PCTFREE ở 0 (zero). Theo quan niệm cơ sở dữ liệu, sẽ chỉ phải thực hiện ít trang đọc hơn để nạp chỉ mục này, nhưng sẽ tốn kém hơn khi bảo trì chỉ mục, do sẽ xảy ra việc chia nhỏ trang chỉ mục.

Bạn phải tạo ra bao nhiêu chỉ mục?

Vậy bạn phải tạo ra bao nhiêu chỉ mục cho một bảng? Câu trả lời thực ra phụ thuộc vào loại ứng dụng mà bạn đang chạy trên bảng.

Sử dụng các qui tắc tổng quát sau đây để xác định số lượng điển hình các chỉ mục mà bạn xác định cho một bảng. Số lượng các chỉ mục dựa vào việc sử dụng ban đầu của cơ sở dữ liệu của bạn:

  • Đối với các môi trường xử lý giao dịch trực tuyến (OLTP), tạo một hoặc hai chỉ mục.
  • Đối với các môi trường hỗn hợp giữa truy vấn và OLTP, tạo khoảng hai đến năm chỉ mục.
  • Đối với môi trường truy vấn chỉ đọc, tạo năm chỉ mục trở lên.

Một tuỳ chọn khác để quyết định tạo các chỉ mục là sử dụng bộ Cố vấn Thiết kế (Design Advisor) trong Trung tâm Điều khiển. Cố vấn Thiết kế sẽ hỏi bạn một số câu hỏi về tải làm việc và thiết kế cơ sở dữ liệu của bạn, rồi sẽ xác định các chỉ mục nào là tốt nhất.

Tính toàn vẹn tham chiếu và chỉ mục

Chỉ mục là một thành phần chủ yếu của tính toàn vẹn tham chiếu. Không có chỉ mục, hiệu năng sẽ nghèo nàn, và việc kiểm tra tính toàn vẹn sẽ vô cùng tốn kém.

Tính toàn vẹn tham chiếu cho phép bạn xác định các mối quan hệ cần có giữa các bảng và trong bảng. Người quản trị cơ sở dữ liệu bảo trì các mối quan hệ này, chúng được diễn giải như là các ràng buộc tham chiếu và đòi hỏi tất cả các giá trị của một thuộc tính hoặc cột bảng đã cho cũng tồn tại trong một số cột bảng khác. Hình sau đây minh họa một ví dụ:

Chúng ta hãy xem một số định nghĩa về các khoá và ràng buộc, bằng cách sử dụng hình trên đây để minh hoạ.

Khoá duy nhất (unique key) là một tập các cột trong đó không có hai giá trị nào bị trùng lặp trong bất kỳ hàng khác nhau. Chỉ một khoá duy nhất có thể được định nghĩa như một khoá chính đối với mỗi bảng. Khoá duy nhất cũng có thể gọi là khoá cha (parent key) khi nó được tham chiếu bởi một khoá ngoại.

Khoá chính (primary key) là một trường hợp đặc biệt của khoá duy nhất. Mỗi bảng chỉ có thể có một khoá chính. Trong hình minh hoạ, DEPTNO và EMPNO là các khoá chính của các bảng DEPARTMENT và EMPLOYEE.

Khoá ngoại (foreign key) là một cột hoặc tập các cột trong một bảng mà tham chiếu đến khoá duy nhất hoặc khoá chính của cùng một bảng hoặc bảng khác. Nó được sử dụng để thiết lập ra một quan hệ với khoá duy nhất hoặc khoá chính và áp đặt tính toàn vẹn tham chiếu trong số các bảng. Cột WORKDEPT trong bảng EMPLOYEE là một khoá ngoại vì nó tham chiếu đến khoá chính -- cột DEPTNO -- trong bảng DEPARTMENT.

Khoá cha (parent key) là một khoá chính hoặc khoá duy nhất của một ràng buộc tham chiếu. Một bảng cha là một bảng chứa một khoá cha liên quan đến ít nhất một khoá ngoại trong cùng một bảng hoặc bảng khác. Một bảng có thể là bảng cha trong một số lượng tuỳ ý các quan hệ. Trong hình trên, bảng DEPARTMENT, với một khoá chính DEPTNO, là một bảng cha của bảng EMPLOYEE, nó chứa khoá ngoại WORKDEPT.

Bảng phụ thuộc (dependent table) là một bảng chứa một hoặc nhiều khoá ngoại. Bảng phụ thuộc cũng có thể là một bảng cha. Một bảng có thể là một bảng phụ thuộc trong một số tuỳ ý các quan hệ. Ví dụ, bảng EMPLOYEE gồm khoá ngoại WORKDEPT, nó phụ thuộc vào bảng DEPARTMENT có một khoá chính.

Ràng buộc tham chiếu là một khẳng định rằng các giá trị khác không của một khoá ngoại đã được xác định là hợp lệ chỉ khi nào chúng cũng xuất hiện như là các giá trị của một khoá duy nhất của một bảng cha đã được xác định. Mục đích của các ràng buộc tham chiếu là để đảm bảo rằng các mỗi quan hệ trong cơ sở dữ liệu được bảo trì và các qui tắc nhập dữ liệu được làm theo.

Sự áp đặt các ràng buộc tham chiếu có ý nghĩa đặc biệt đối với một số thao tác SQL mà phụ thuộc vào việc liệu bảng đó là một bảng cha hay là bảng phụ thuộc. Người quản trị cơ sở dữ liệu áp đặt các ràng buộc tham chiếu qua các hệ thống dựa trên qui tắc toàn vẹn tham chiếu. Các qui tắc đó là:

  • INSERT (CHÈN).
  • DELETE (XÓA).
  • UPDATE (CẬP NHẬT).

Tạo các ràng buộc toàn vẹn tham chiếu

Để xác định một quan hệ khoá ngoại giữa hai bảng:

  1. Tạo bảng cha với một khoá chính.
  2. Nạp dữ liệu vào bảng cha.
  3. Tạo bảng phụ thuộc với quan hệ khoá ngoại.
  4. Nạp dữ liệu vào bảng phụ thuộc.

Đối với ví dụ EMPLOYEE và DEPARTMENT từ bảng điều khiển trước đó, định nghĩa bảng DEPARTMENT như sau:

CREATE TABLE DEPARTMENT
  (
  DEPTNO    INT         NOT NULL PRIMARY KEY,
  DEPTNAME  VARCHAR(20) NOT NULL,
  MGRNO     INT
  )

Định nghĩa bảng cho bảng DEPARTMENT không nhất thiết phải có một đặc tả PRIMARY KEY trên dòng DEPTNO; bạn có thể sử dụng một lệnh CREATE UNIQUE INDEX thay vào đó.

Khi dữ liệu đã được nạp vào bảng DEPARTMENT rồi thì bảng EMPLOYEE có thể được tạo ra. Lưu ý rằng bạn không cần nạp dữ liệu vào bảng DEPARTMENT ngay, nhưng bạn sẽ cần đưa vào nó các dữ liệu trước khi bảng EMPLOYEE có thể có dữ liệu được chèn vào. Bảng EMPLOYEE có thể được định nghĩa như sau:

CREATE TABLE EMPLOYEE
  (
  EMPNO     INT         NOT NULL PRIMARY KEY,
  FIRSTNAME VARCHAR(20) NOT NULL,
  LASTNAME  VARCHAR(20) NOT NULL,
  WORKDEPT  INT         NOT NULL,
  PHONENO   CHAR(12)    NOT NULL,
  FOREIGN KEY(WORKDEPT) REFERENCES DEPARTMENT(DEPTNO)
  ON DELETE RESTRICT)
  )

Mệnh đề FOREIGN KEY xác định quan hệ giữa bảng EMPLOYEE (nhân viên) và bảng DEPARTMENT (phòng ban). Do mối quan hệ này, một nhân viên không thể được chèn vào bảng nếu WORKDEPT nhân viên đó chưa tồn tại trong bảng phòng ban. Ngoài ra, bất kỳ cập nhật nào mà WORKDEPT của nhân viên đó cũng sẽ được kiểm tra đối với danh sách phòng ban. Mệnh đề bổ sung ON DELETE RESTRICT (hạn chế xoá) báo cho DB2 biết để ngăn chặn việc xoá đi một bản ghi phòng ban trong bảng DEPARTMENT, nếu có các tham chiếu đến phòng ban đó trong bảng EMPLOYEE. Nói một cách khác, các nhân viên của một phòng ban tất cả phải được chuyển đến các phòng ban khác trước khi DB2 cho phép phòng ban đó bị xóa. Các tuỳ chọn khác là làm cho WORKDEPT bị rỗng khi xoá một phòng ban (ON DELETE SET NULL), hoặc xóa bản ghi của nhân viên mà kết nối với bản ghi này (ON DELETE CASCADE).

Theo quan niệm về chỉ mục, cả hai bảng phải có các khoá chính được xác định. Việc này triệt tiêu các trùng lặp từ cả hai bảng, mà cũng cải thiện hiệu quả phép chọn. Tuy nhiên, khoá chính trên bảng DEPARTMENT là cần thiết để quan hệ khoá ngoại có thể được thiết lập với bảng EMPLOYEE.

Quyền hạn của tính toàn vẹn tham chiếu

Để tạo ra một bảng với một ràng buộc tham chiếu liên kết với nó (khoá ngoại), người sử dụng phải có các quyền hạn phù hợp.

Xem xét ví dụ trước của chúng ta với các bảng EMPLOYEE và bảng DEPARTMENT (xem Tính toàn vẹn tham chiếu và các chỉ mục). Nếu bảng DEPARTMENT được sở hữu và quản lý bởi phòng quản trị (facilities department), và bảng EMPLOYEE được quản lý bởi phòng nhân sự (personnel department), hai phòng cần hợp tác với nhau. Nếu bảng EMPLOYEE đã có ràng buộc ngoại được xác định đối với bảng DEPARTMENT, người sử dụng trong phòng quản trị không thể xóa bất kỳ bản ghi nào của phòng mà không có sự giúp đỡ của người trong phòng nhân sự! Đây là do quy tắc ON DELETE RESTRICT được đặt ra đối với bảng DEPARTMENT. Điều này có nghĩa là một người sử dụng có thể đặt ra một số hạn chế đối với bảng của bạn mà không cần ý kiến của bạn. Để tránh việc này, quyền hạn rõ ràng để đặt ra các ràng buộc tham chiếu phải được đưa cho phòng nhân sự (chủ nhân của bảng EMPLOYEE):

GRANT REFERENCES(DEPTNO) ON DEPARTMENT TO USER PERSONNEL

Tóm tắt

Chỉ mục là một thành phần chủ yếu của việc thiết kế cơ sở dữ liệu. Chúng có thể được sử dụng để cải thiện hiệu năng, gộp các bản ghi lên các trang, và đảm bảo tính duy nhất của các bản ghi.

Thiết kế chỉ mục rất phụ thuộc vào loại công việc và lượng không gian cần thiết dành cho lưu trữ. Các trường phụ có thể được thêm vào một chỉ mục để cải thiện hiệu năng truy vấn. Các công cụ cũng tồn tại để giúp xác định các chỉ mục cần có cho hệ thống của bạn.

Tính toàn vẹn tham chiếu là một dạng kiểm tra ràng buộc giữa một bảng phụ thuộc và một bảng cha. Chỉ mục là cần có để đảm bảo tính duy nhất trong bảng cha, cũng như cải thiện hiệu năng kiểm tra khoá trong quá trình chèn và cập nhật. Quyền hạn đặc biệt phải được trao cho các chủ nhân của bảng phụ thuộc để có thể tạo ra các ràng buộc tham chiếu đối với các bảng mà họ không sở hữu.


Xác định các ràng buộc dữ liệu trên các bảng

Ràng buộc là gì?

Tính toàn vẹn hoặc tính hợp lệ của dữ liệu trong một cơ sở dữ liệu có tầm quan trọng cốt yếu. Thật khó mà đảm bảo tính hợp lệ của dữ liệu nhập vào cơ sở dữ liệu; DB2 cung cấp khả năng để xác định một số ràng buộc hoặc kiểm tra dựa trên qui tắc mà có thể hợp nhất vào cơ sở dữ liệu. Trong DB2, các việc kiểm tra sau có thể được dùng để giảm thiểu nguy cơ đưa dữ liệu không chính xác vào một bảng:

  • Các trường trong một hàng có thể được kiểm tra để xem liệu chúng có phù hợp về kiểu dữ liệu và độ dài của cột với điều mà chúng liên kết không. Ví dụ, giá trị “Geoff” không phù hợp với một kiểu dữ liệu cột INTEGER, và do đó một hàng với giá trị đó sẽ bị loại bỏ, như vậy đảm bảo tính hợp lệ của dữ liệu trong cơ sở dữ liệu.

  • Nếu một ràng buộc khoá chính đã được định nghĩa trên một bảng, thì mỗi hàng trong bảng đó phải có một giá trị duy nhất trong cột hoặc tổ hợp các cột tạo nên khoá chính. Nếu một hàng được chèn vào với cùng một khoá giống như khoá hiện hành, hàng mới đó sẽ bị loại bỏ.

  • Nếu một ràng buộc duy nhất đã được định nghĩa trên một bảng, mỗi hàng trong bảng phải phù hợp với ràng buộc này bằng cách có một giá trị duy nhất hoặc kết hợp các giá trị tạo nên khoá duy nhất.

  • Nếu một ràng buộc khoá ngoại đã được định nghĩa, mỗi hàng trong bảng phải có một giá trị trong cột hoặc các cột khoá ngoại mà phù hợp với một khoá chính của một hàng trong một bảng cha. Trong một số trường hợp, một giá trị rỗng có thể là chấp nhận được nếu cột hoặc các cột đó được định nghĩa là một bộ phận của khoá ngoại cũng được định nghĩa là có thể rỗng (nullable).

  • Nếu một ràng buộc kiểm tra đã được định nghĩa trên một cột, mỗi hàng phải phù hợp với ràng buộc đó. Thí dụ, một ràng buộc kiểm tra trên một cột tiền lương của một bảng nhân viên có thể ngăn chặn một ứng dụng hoặc người sử dụng chèn vào một bản ghi nhân viên mới hoặc hàng mà mức lương nhỏ hơn 0. Bất kỳ hàng nào được chèn vào bảng mà có một giá trị lương nhỏ 0 sẽ bị loại bỏ, như vậy giảm thiểu được nguy cơ chèn dữ liệu không chính xác vào bảng.

Tất cả các ràng buộc khoá chính, ràng buộc duy nhất, và ràng buộc khoá ngoại được bàn luận trong phần Tạo và quản lý các chỉ mục. Phần đó xử lý chủ yếu các ràng buộc kiểm tra.

Ràng buộc bảng

Các ràng buộc kiểm tra bảng sẽ áp đặt toàn vẹn dữ liệu ở cấp độ bảng. Một khi một ràng buộc kiểm tra bảng đã được định nghĩa cho một bảng, mỗi lệnh UPDATE và lệnh INSERT sẽ gồm cả việc kiểm tra sự hạn chế hoặc ràng buộc. Nếu ràng buộc bị vi phạm, hàng đó sẽ không được chèn vào hoặc cập nhật, và một lỗi SQL sẽ được trả lại.

Một ràng buộc kiểm tra bảng có thể được định nghĩa vào lúc tạo bảng hoặc sau đó bằng cách sử dụng lệnh ALTER TABLE. Các ràng buộc kiểm tra bảng có thể giúp thực hiện các quy tắc riêng cho các giá trị dữ liệu chứa trong bảng bằng cách quy định các giá trị được phép trong một hoặc nhiều cột trong mỗi hàng của bảng. Việc này có thể tiết kiệm được thời gian cho nhà phát triển ứng dụng, do việc xác thực của từng giá trị dữ liệu có thể được thực hiện bởi cơ sở dữ liệu và không phải bởi từng ứng dụng truy cập cơ sở dữ liệu.

Thêm các ràng buộc

Khi bạn thêm một ràng buộc kiểm tra vào một bảng chứa dữ liệu, có hai khả năng:

  • Tất cả các hàng sẽ thoả mãn ràng buộc kiểm tra đó.
  • Một số hoặc tất cả các hàng thực hiện sẽ không thoả mãn ràng buộc kiểm tra.

Trong trường hợp đầu, khi tất cả các hàng thoả mãn ràng buộc kiểm tra, ràng buộc kiểm tra sẽ được tạo ra thành công. Các cố gắng chèn vào hoặc cập nhật dữ liệu sau này nếu không thoả mãn qui tắc làm việc về ràng buộc sẽ bị loại bỏ.

Nếu có một số hàng không thoả mãn được ràng buộc kiểm tra, ràng buộc kiểm tra sẽ không được tạo ra (nghĩa là lệnh ALTER TABLE sẽ thất bại).

Một lệnh ALTER TABLE (sửa đổi bảng) thêm một ràng buộc mới vào bảng EMPLOYEE đã bàn luận trước đây (xem Tính toàn vẹn tham chiếu và các chỉ mục) được chỉ ra dưới đây. Các ràng buộc kiểm tra được đặt tên là check_job (kiểm tra công việc). DB2 sẽ sử dụng tên này để thống báo cho chúng ta nếu ràng buộc bị vi phạm khi một lệnh INSERT hay lệnh UPDATE thất bại.

ALTER TABLE EMPLOYEE
  ADD CONSTRAINT check_job
  CHECK (JOB IN ('Engineer','Sales','Manager'))

Không có lệnh đặc biệt nào dùng để thay đổi một ràng buộc kiểm tra. Bất cứ khi nào cần thay đổi một ràng buộc kiểm tra, bạn phải bỏ bớt nó và tạo mới. Các ràng buộc kiểm tra có thể được bỏ bớt bất cứ lúc nào, và hành động này sẽ không ảnh hưởng đến bảng của bạn hoặc dữ liệu trong nó.

Tạo bảng với các ràng buộc

Bạn có thể thêm một ràng buộc vào một bảng khi bạn đang tạo ra bảng đó. Một ràng buộc có thể được thêm vào các cột riêng bằng cách thêm mệnh đề CONSTRAINT/CHECK sau định nghĩa cột:

CREATE TABLE EMPLOYEE
  (
  EMPNO INT NOT NULL PRIMARY KEY,
  JOB VARCHAR(10) CONSTRAINT CHECK_JOB
      CHECK (JOB IN ('Engineer','Sales','Manager')),
  ...
  )

Tên CONSTRAINT không đòi hỏi phải là một bộ phận của định nghĩa, nhưng bạn nên đặt tên ràng buộc này trong trường hợp bạn muốn sửa đổi nó vào một ngày nào sau đó. Nếu bạn không đặt tên ràng buộc, bạn sẽ phải xác định tên do hệ thống của nó định nghĩa.

Ràng buộc cũng có thể được xác định qua nhiều cột, và các định nghĩa này thường được đặt ở phần cuối của tất cả các định nghĩa cột. Các ràng buộc này kết hợp các giá trị cột và thường được gọi là các ràng buộc bảng (table constraints). SQL sau đây là một ví dụ về một ràng buộc bảng mà kiểm tra tuổi và mức lương cá nhân:

CREATE TABLE EMPLOYEE
  (
  ...,
  CONSTRAINT CHECK_AGE_SALARY
    CHECK (NOT(AGE < 30 AND SALARY > 60000))
  )

Logic khác thường trong lệnh CHECK cần thiết do cách mà ràng buộc được xử lý. Ràng buộc trong dấu ngoặc phải đúng đối với bản ghi được chèn vào. Điều này có nghĩa là lệnh NOT(AGE < 30 AND SALARY > 60000) phải đúng. Diễn dịch của logic này là không ai có thể trẻ hơn 30 tuổi và làm ra nhiều hơn 60000 một năm.

Ràng buộc mang thông tin

Tất cả các ràng buộc mà chúng ta đã định nghĩa cho đến nay đều được áp đặt bởi DB2 khi chèn các bản ghi hoặc cập nhật. Điều này có thể dẫn đến phí tổn hệ thống tăng cao, nhất là khi tải số lượng lớn các bản ghi.

Nếu một ứng dụng đã kiểm chứng được thông tin trước khi chèn một bản ghi vào DB2, có thể hiệu quả hơn khi sử dụng các ràng buộc mang thông tin (informational constraints), thay vì ràng buộc bình thường. Ràng buộc mang thông tin báo cho DB2 biết định dạng dữ liệu sẽ là gì, nhưng không bị áp đặt trong quá trình chèn hoặc cập nhật. Tuy nhiên, thông tin này có thể được sử dụng bởi bộ tối ưu hoá DB2 và có thể đem lại hiệu năng tốt hơn các truy vấn SQL. Xem xét sau đây lệnh CREATE TABLE statement:

CREATE TABLE EMPDATA
  (
  EMPNO INT NOT NULL,
  SEX CHAR(1) NOT NULL
      CONSTRAINT SEXOK
      CHECK (SEX IN ('M','F'))
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION,
  SALARY INT NOT NULL,
      CONSTRAINT SALARYOK
      CHECK (SALARY BETWEEN 0 AND 100000)
      NOT ENFORCED
      ENABLE QUERY OPTIMIZATION
  )

Thí dụ này gồm hai lệnh làm thay đổi hành vi của các ràng buộc cột. Tuỳ chọn thứ nhất là NOT ENFORCED (không áp đặt), nó chỉ thị cho DB2 không áp đặt việc kiểm tra cột này khi dữ liệu được chèn vào hoặc cập nhật. Tuỳ chọn thứ hai là ENABLE QUERY OPTIMIZATION (cho phép tối ưu hoá truy vấn), được sử dụng bởi DB2 khi các lệnh SELECT chạy trên bảng này. Khi giá trị này được quy định, DB2 sẽ sử dụng các thông tin trong ràng buộc khi tối ưu hóa SQL.

Tuỳ chọn NOT ENFORCED

Nếu bảng chứa tuỳ chọn NOT ENFORCED hành vi của các lệnh INSERT có thể trở nên thừa. SQL sau đây sẽ không tạo ra bất kỳ lỗi nào khi chạy đối với bảng EMPDATA:

INSERT INTO EMPDATA VALUES
  (1, 'M', 54200),
  (2, 'F', 28000),
  (3, 'M', 21240),
  (4, 'F', 89222),
  (5, 'Q', 34444),
  (6, 'K',132333)

Nhân viên mã số 5 có một nghi vấn về giới tính (Q), và nhân viên mã số 6 có cả một giới tính không bình thường và một mức lương vượt quá giới hạn của cột tiền lương. Trong cả hai trường hợp DB2 sẽ cho phép việc chèn vào, vì các ràng buộc này là NOT ENFORCED (không áp đặt). Điều này cho thấy một trong những điểm yếu của ràng buộc mang thông tin. Bạn phải chắc chắn rằng dữ liệu mà bạn là đang chèn hoặc nạp vào phù hợp với các định nghĩa mà bạn đã đặt vào DB2.

Tuỳ chọn ENABLE QUERY OPTIMIZATION

Điều có thể sẽ gây ra nhiều nhầm lẫn là kết quả của một lệnh chọn trên bảng EMPDATA sau khi chèn mà bạn đã chạy trong bảng điều khiển cuối cùng:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------

0 record(s) selected.

DB2 trả lại kết quả không đúng cho truy vấn. Giá trị “Q” được tìm thấy trong bảng, nhưng ràng buộc trên cột này báo cho DB2 biết rằng chỉ có các giá trị hợp lệ là “M” và “F”. Từ khoá ENABLE QUERY OPTIMIZATION (cho phép tối ưu hoá truy vấn) cũng cho phép DB2 sử dụng thông tin ràng buộc này khi tối ưu hóa các lệnh SQL. Nếu đây không phải là hành vi mà bạn muốn, thì bạn cần thay đổi ràng buộc qua việc sử dụng lệnh ALTER:

ALTER TABLE EMPDATA
  ALTER CHECK SEXOK DISABLE QUERY OPTIMIZATION

Bây giờ, chúng ta hãy thực hiện lại truy vấn trước đây của chúng ta. Kết quả như sau:

SELECT * FROM EMPDATA
  WHERE SEX = 'Q';

EMPNO       SEX SALARY
----------- --- -----------
          5 Q         34444

1 record(s) selected.

Khi nào các ràng buộc mang thông tin được sử dụng trong DB2? Kịch bản tốt nhất cho việc sử dụng ràng buộc mang thông tin xuất hiện khi người sử dụng đảm bảo được rằng chương trình ứng dụng là ứng dụng duy nhất chèn và cập nhật dữ liệu. Nếu ứng dụng đã kiểm tra toàn bộ các thông tin trước đó, sau đó sử dụng các ràng buộc mang thông tin có thể làm cho hiệu năng nhanh hơn và không phải gắng sức gấp đôi.

Tóm tắt

Có nhiều ràng buộc khác nhau có sẵn trong DB2 để bảo trì toàn vẹn dữ liệu. Chúng là các ràng buộc kiểu dữ liệu, khoá chính, duy nhất, khoá ngoại, và kiểm tra.

Ràng buộc kiểm tra cho phép người dùng đặt các quy tắc về dữ liệu trong một cột để đảm bảo rằng các tiêu chí nhất định được đáp ứng trước khi cho phép một hàng được nhập. Các ràng buộc này có thể thay đổi nhằm áp các điều kiện, hoặc bỏ qua chúng. Tương tự như vậy, bộ tối ưu hoá cũng có thể được báo cho biết để dùng thông tin trong ràng buộc nhằm mục đích tối ưu hoá, hoặc bỏ qua chúng.

Việc sử dụng đúng các ràng buộc kiểm tra có thể giúp cải thiện hiệu năng truy vấn và giảm thiểu thời gian nạp. Tuy nhiên, nếu không làm sạch dữ liệu hợp lí, kết quả tìm thấy không phải lúc nào cũng chính xác.


Tạo và quản lý các khung nhìn

Khung nhìn

Khung nhìn (View) là bảng ảo mà có nguồn gốc từ một hoặc nhiều bảng hay khung nhìn; chúng có thể được sử dụng lẫn với bảng khi truy tìm dữ liệu. Khung nhìn có thể rất hữu ích khi bạn muốn ẩn một số cột hoặc hàng nhất định của một bảng cơ sở. Nếu bạn không muốn tạo ra một bản khác nữa của một bảng, bạn có thể sử dụng một khung nhìn để tạo ra một bảng ảo, chỉ để hiện cho người dùng các dữ liệu mà bạn muốn cho họ xem.

Khi các thay đổi được thực hiện đối với dữ liệu qua khung nhìn, dữ liệu được thay đổi trong bảng nằm dưới chính nó. Khung nhìn tự chúng không gồm bất kỳ dữ liệu thực nào. Có một số tình huống trong đó các khung nhìn không thể cập nhật được, như vậy khung nhìn có thể phân ra thành các loại có thể xoá được, cập nhật được, thêm được, hay chỉ đọc mà thôi. Việc phân loại cho biết loại thao tác SQL được phép đối với khung nhìn.

Một khung nhìn đơn giản

Một ví dụ đơn giản sẽ minh họa khả năng và tính hữu ích của một khung nhìn. Xem xét bảng nhân sự sau đây:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20),
  LAST_NAME  VARCHAR(20),
  SALARY     DEC(9,2),
  EXTENSION  CHAR(4),
  ...
  )

Đó không phải là các bảng nhân sự phức tạp nhất, nhưng nó sẽ giúp minh họa một điểm về khung nhìn. Bảng này gồm các thông tin rất nhạy cảm, thí dụ như lương nhân viên. Tuy nhiên, nhiều thông tin trong bảng này có thể dùng cho các phòng ban hoặc người sử dụng khác. Ví dụ như cột mở rộng (số điện thoại) có thể dùng để tạo ra một danh mục điện thoại nội bộ. Làm thế nào để bạn có thể tận dụng được các thông tin này mà không làm ảnh hưởng đến sự toàn vẹn của thông tin mức lương.

Có lẽ bạn đã đoán rằng giải pháp đó có liên quan đến khung nhìn. Bạn có thể tạo ra một khung nhìn trên bảng này mà hạn chế người sử dụng ở mức chỉ nhìn thấy một số cột nhất định. Lệnh SQL sau tạo ra một khung nhìn mà hiển thị tên riêng, tên họ, và số điện thoại của người sử dụng:

CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

Bạn cho người sử dụng quyền truy cập đến khung nhìn này chứ không phải là bảng nhân sự cơ sở. Một người sử dụng chạy một lệnh chọn đối với khung nhìn chỉ trông thấy ba cột:

SELECT * FROM TELEPHONE_BOOK;

FIRST_NAME     LAST_NAME     EXTENSION
-------------- ------------- ---------
ANDREW         BAKLARZ       2431
GEOFFREY       BAKLARZ       8734
...

Một khung nhìn có thể phức tạp hơn nhiều so với khung nhìn này, nhưng ví dụ này minh họa cho các đặc điểm cơ bản.

Cú pháp của khung nhìn

Truy cập đến hướng dẫn tham khảo DB2 SQL sẽ rất hữu ích vào lúc này. Tất nhiên, bạn có lẽ không sẵn có, nên đây là một sơ đồ cú pháp ngắn để tạo khung nhìn:

CREATE VIEW view-name (column list) AS (fullselect)

Đây thực ra không phải là tất cả các bộ phận của cú pháp lệnh, nhưng nó thực sự minh họa cho điều mà bạn có thể hay sử dụng nhất. Lệnh CREATE gồm các thành phần này:

  • Tên khung nhìn: Ký hiệu định danh cho khung nhìn này. Nó có cùng các giới hạn như một tên bảng thật và không thể như bảng đã lưu.
  • Danh sách cột: Phần tuỳ chọn này báo cho DB2 biết tên của các cột sẽ là gì khi tập kết quả được trả về. Chẳng hạn như trong ví dụ trước, tất cả các cột có thể được đổi lại tên, như thế này:
    CREATE VIEW TELEPHONE_BOOK(FIRST, LAST, PHONE) AS
      (
      SELECT FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
      )
  • Fullselect (chọn toàn bộ): Đây là SQL sẽ được sử dụng để tạo ra định nghĩa của khung nhìn. Một fullselect có thể trả lại các hàng riêng lẻ dựa trên một mệnh đề WHERE, hoặc nó có thể thực hiện các phép nối, gộp, hoặc bất kỳ phép SQL phức hợp nào.

Các khung nhìn với UNION

Các khung nhìn với các bảng liên kết nhờ sử dụng UNION ALL đã được hỗ trợ trong một số phiên bản DB2. Các toán tử SELECT, DELETEUPDATE cũng cho phép, làm cho DB2 xác định được bảng mà áp dụng được các lệnh tương ứng.

Trong DB2, việc hỗ trợ cho toán tử INSERT đã được mở rộng đến các khung nhìn với UNION ALL, cho đến khi có điều kiện sau đây:

  • Các biểu thức có cùng kiểu dữ liệu.
  • Một ràng buộc tồn tại trên ít nhất một cột dùng để định danh nơi một hàng sẽ được chèn, và các phạm vi ràng buộc không chồng nhau.

Khung nhìn được định nghĩa theo kiểu này cũng sẽ hỗ trợ các phép toán UPDATE cho đến khi cột đang được thay đổi không vi phạm ràng buộc cho cột đó. Trong trường hợp này, người sử dụng trước hết phải DELETE và sau đó INSERT bản ghi.

Khung nhìn xoá được

Tuỳ thuộc vào cách một khung nhìn được định nghĩa, khung nhìn có thể là loại xoá được. Một khung nhìn xoá được là một khung nhìn đối với nó bạn có thể chạy một lệnh DELETE thành công. Có một vài quy tắc cần được làm theo đối với một khung nhìn được coi là xoá được:

  • Mỗi mệnh đề FROM của Fullselect ngoài phải xác định duy nhất một bảng cơ sở (mà không có mệnh đề OUTER), khung nhìn xoá được (không có mệnh đề OUTER ), biểu thức bảng được lồng vào có thể xoá được, hoặc biểu thức bảng thông thường có thể xoá được.
  • Fullselect ngoài không được sử dụng mệnh đề VALUES.
  • Fullselect ngoài không được sử dụng các mệnh đề GROUP BY hoặc HAVING.
  • Fullselect ngoài không được chứa các hàm cột trong danh sách chọn của nó.
  • Fullselect ngoài không được sử dụng các phép toán thiết đặt từ trước (UNION, EXCEPT hoặc INTERSECT) với ngoại lệ UNION ALL.
  • Các bảng cơ sở trong toán hạng của một UNION ALL không được cùng là một bảng, và toán hạng nào cũng phải là loại xoá được.
  • Danh sách chọn của fullselect ngoài không được có DISTINCT.

Một khung nhìn phải thoả mãn toàn bộ các quy tắc liệt kê trên đây được coi là một khung nhìn xoá được.

Khung nhìn cập nhật được

Khung nhìn cập nhật được là một trường hợp đặc biệt của khung nhìn xoá được. Một khung nhìn xoá được trở thành một khung nhìn cập nhật được khi ít nhất một trong số các cột của nó cập nhật được. Một cột của một khung nhìn cập nhật được khi thỏa mãn tất cả các quy tắc sau:

  • Khung nhìn phải là loại xoá được.
  • Cột phải chuyển hoá thành một cột của một bảng (không phải bằng cách sử dụng một phép toán truy cập có địa chỉ định trước (a dereference operation)), và không được quy định tuỳ chọn READ ONLY.
  • Tất cả các cột tương ứng của toán hạng của một UNION ALL phải khớp chính xác về các kiểu dữ liệu (gồm độ dài hoặc độ chính xác và độ lớn), và tương hợp với các giá trị mặc định nếu fullselect của khung nhìn gồm cả một UNION ALL.

Khung nhìn thêm được và khung nhìn chỉ đọc

Khung nhìn thêm được cho phép bạn chèn các hàng bằng cách sử dụng định nghĩa khung nhìn. Một khung nhìn thêm được khi tất cả các cột của nó là cập nhật được. Ví dụ, xem xét bảng PERSONNEL sau đây và khung nhìn liên kết của nó, TELEPHONE_BOOK:

CREATE TABLE PERSONNEL
  (
  PERSON_ID  INT NOT NULL,
  FIRST_NAME VARCHAR(20) NOT NULL,
  LAST_NAME  VARCHAR(20) NOT NULL,
  SALARY     DEC(9,2) NOT NULL,
  EXTENSION  CHAR(4) NOT NULL
  )
  
CREATE VIEW TELEPHONE_BOOK AS
  (
  SELECT PERSON_ID, FIRST_NAME, LAST_NAME, EXTENSION FROM PERSONNEL
  )

Khung nhìn TELEPHONE_BOOK không thể là thêm được vì một lệnh chèn không bao gồm trường SALARY, và trường này không thể rỗng. Tuy nhiên, nếu định nghĩa bảng ban đầu đã bao gồm sẵn một mệnh đề DEFAULT cho trường SALARY, hoặc nếu trường được phép là rỗng, thì khung nhìn sẽ thêm được.

Khung nhìn chỉ đọc là một khung nhìn không thể xoá được (xem Khung nhìn xoá được). Một khung nhìn có thể là chỉ đọc nếu nó không phù hợp với ít nhất một trong các quy tắc đối với các khung nhìn xoá được.

Trong trường hợp một khung nhìn là loại chỉ đọc, một bộ kích hoạt INSTEAD OF có thể được định nghĩa cho nó để hướng dẫn cách thực hiện việc bổ sung.

Một bộ kích hoạt INSTEAD OF được sử dụng chỉ trên các khung nhìn, không trên các bảng cơ sở. Nó có các đặc tính tương tự của một bộ kích hoạt bình thường, nhưng có các hạn chế sau đây:

  • Nó chỉ được phép trên các khung nhìn.
  • Nó luôn luôn là FOR EACH ROW
  • Các giá trị DEFAULT được chuyển qua như giá trị rỗng (null).
  • Nó không thể sử dụng UPDATE/DELETE đã được định vị trên con trỏ qua khung nhìn với bộ kích hoạt INSTEAD OF UPDATE/DELETE.

Định nghĩa một bộ kích hoạt INSTEAD OF để xử lý các tình huống một phép chèn là mơ hồ, và sau đó tránh các hạn chế của một khung nhìn chỉ đọc.

Với tùy chọn CHECK

Nếu định nghĩa khung nhìn bao gồm các điều kiện (thí dụ như mệnh đề WHERE ) và ý định của nó là để bảo đảm rằng bất kỳ lệnh INSERT hoặc UPDATE nào tham chiếu đến khung nhìn sẽ có mệnh đề WHERE được áp dụng, khung nhìn phải được định nghĩa bằng cách sử dụng WITH CHECK OPTION. Tùy chọn này có thể đảm bảo sự toàn vẹn của dữ liệu được thay đổi trong cơ sở dữ liệu. Một lỗi SQL sẽ được trả lại nếu điều kiện này bị vi phạm trong thời gian có thao tác INSERT hoặcUPDATE.

Sau đây là một thí dụ về một định nghĩa khung nhìn bằng cách sử dụng WITH CHECK OPTION. WITH CHECK OPTION là cần có để đảm bảo rằng điều kiện này luôn được kiểm tra. Trong trường hợp này, bạn muốn đảm bảo rằng DEPT luôn luôn là 10. Việc này sẽ hạn chế các giá trị đầu vào đối với cột DEPT. Khi một khung nhìn được sử dụng để chèn vào một giá trị mới, WITH CHECK OPTION luôn luôn được áp đặt.

CREATE VIEW EMP_VIEW2
  (EMPNO,EMPNAME,DEPTNO,JOBTITLE,HIREDATE)
  AS SELECT ID,NAME,DEPT,JOB,HIREDATE FROM EMPLOYEE
    WHERE DEPT=10
  WITH CHECK OPTION

Nếu mệnh đề này không tồn tại, có thể sẽ có một người nào đó làm việc với khung nhìn này cập nhật một bản ghi để nó không còn là một thành phần của khung nhìn. Chẳng hạn lệnh SQL sau sẽ gây ra một số vấn đề.

UPDATE EMP_VIEW2 SET DEPT=20 WHERE DEPT=10

Kết quả của lệnh này là khung nhìn bây giờ không còn chứa các bản ghi nào, do không còn nhân viên nào nữa trong phòng 10.

Khung nhìn không hoạt động

Khung nhìn không hoạt động là một khung nhìn mà không còn sẵn có nữa đối với các lệnh SQL. Một khung nhìn trở nên không hoạt động nếu:

  • Một đặc quyền về quyết định định nghĩa khung nhìn bị thu hồi.
  • Một đối tượng, ví dụ như một bảng, bí danh, hoặc hàm, trên đó định nghĩa khung nhìn là phụ thuộc bị bỏ bớt.
  • Một khung nhìn định nghĩa khung nhìn này không còn hoạt động.
  • Một khung nhìn mà siêu khung nhìn (superview) của định nghĩa khung nhìn (khung nhìn con) trở thành không hoạt động.

Một khung nhìn không thể thay đổi được trong DB2. Bạn phải tạo lại nó với các thay đổi mà bạn muốn.

Tóm tắt

Khung nhìn là một cách hiệu quả để trình bày dữ liệu mà không cần bảo trì nó. Khung nhìn không phải là một bảng thực sự và không đòi hỏi lưu trữ lâu dài.

Khung nhìn có thể chứa tất cả hoặc một số cột hoặc hàng của bảng mà khung nhìn dựa vào. Thí dụ bạn có thể tham gia vào một bảng phòng ban và một bảng nhân viên trong một khung nhìn, để bạn có thể lên danh sách toàn bộ nhân viên trong một phòng ban riêng.

Một khung nhìn có thể gồm một tuỳ chọn để đảm bảo rằng việc chèn và cập nhật trên khung nhìn không vi phạm định nghĩa khung nhìn.

Khung nhìn có thể cho phép chèn, xóa, và cập nhật đối với bảng cơ sở cho đến khi các tiêu chí nhất định được đáp ứng. Ngay cả với một khung nhìn không thể cập nhật được, một bộ kích hoạt INSTEAD OF có thể được viết để tránh được hạn chế này.


Truy cập các bảng danh mục hệ thống

Bảng danh mục hệ thống

Một tập các bảng danh mục hệ thống được tạo ra và được bảo trì cho mỗi cơ sở dữ liệu. Các bảng này chứa các thông tin về định nghĩa của các đối tượng cơ sở dữ liệu (ví dụ, bảng, khung nhìn, chỉ mục, và đóng gói) và thông tin bảo mật về kiểu truy cập mà người dùng có trên các đối tượng này. Các bảng này được lưu trữ trong không gian bảng SYSCATSPACE.

Bảng danh mục hệ thống trông giống như bất kỳ bảng nào khác tìm thấy trong cơ sở dữ liệu. Bạn có thể SELECT (CHỌN) các thông tin từ chúng bằng cách sử dụng cú pháp SQL chuẩn. Một danh sách thí dụ về bảng danh mục thấy trong minh hoạ sau:

Các bảng này được cập nhật trong khi thao tác một cơ sở dữ liệu, chẳng hạn khi bảng được tạo. Bạn rõ ràng không thể tạo ra hoặc bỏ bớt các bảng này, nhưng bạn có thể truy vấn và xem được nội dung của chúng. Khi cơ sở dữ liệu được tạo, ngoài đối tượng bảng danh mục hệ thống, một số đối tượng cơ sở dữ liệu khác cũng được xác định trong danh mục hệ thống:

  • Một tập các chương trình con (các hàm và thủ tục) được tạo ra trong các lược đồ SYSIBM, SYSFUN và SYSPROC.
  • Một tập các khung nhìn chỉ đọc đối với các bảng danh mục hệ thống được tạo trong lược đồ SYSCAT (schema).
  • Một tập các khung nhìn danh mục cập nhật được tạo trong lược đồ SYSSTAT. Các khung nhìn cập nhật được này cho phép bạn cập nhật các thông tin thống kê nào đó để khảo sát hiệu năng của một cơ sở dữ liệu giả định, hoặc cập nhật các thống kê mà không cần sử dụng tiện ích RUNSTATS.

Sau khi một cơ sở dữ liệu đã được tạo, có lẽ bạn mong được giới hạn quyền truy cập đến các khung nhìn danh mục hệ thống.

Đặc quyền về các bảng danh mục hệ thống

Trong khi tạo cơ sở dữ liệu, đặc quyền SELECT trên các khung nhìn danh mục hệ thống được cấp cho PUBLIC. Trong phần lớn các trường hợp, việc này không đưa ra bất kỳ vấn đề bảo mật nào. Tuy nhiên, các bảng này mô tả từng đối tượng trong cơ sở dữ liệu, và có lẽ bạn không muốn ai cũng biết các chi tiết này.

Nhằm giảm bớt mọi rủi ro về bảo mật, bạn phải thu hồi đặc quyền SELECT từ PUBLIC và sau đó cấp đặc quyền SELECT theo yêu cầu cho người sử dụng cụ thể. Việc cấp và thu hồi đặc quyền SELECT trên các khung nhìn danh mục hệ thống được thực hiện giống như với bất kỳ khung nhìn nào khác, nhưng bạn phải có quyền SYSADM hoặc quyền DBADM để thực hiện nó.

Sau đây là một tập các bảng mà bạn phải hạn chế truy cập:

  • SYSCAT.DBAUTH
  • SYSCAT.TABAUTH
  • SYSCAT.PACKAGEAUTH
  • SYSCAT.INDEXAUTH
  • SYSCAT.COLAUTH
  • SYSCAT.PASSTHRUAUTH
  • SYSCAT.SCHEMAAUTH

Việc hạn chế truy cập đến các bảng này ngăn chặn thông tin về đặc quyền của người dùng tránh mọi người khác truy cập đến cơ sở dữ liệu.

Trong DB2 9, cũng có một tuỳ chọn khác để hạn chế truy cập đến bảng danh mục hệ thống. Khi chạy lệnh CREATE DATABASE tuỳ chọn RESTRICTIVE có thể được sử dụng làm cho không có đặc quyền nào được tự động cấp cho PUBLIC.

Thu hồi quyền truy cập SELECT

Để loại bỏ quyền truy cập SELECT ra khỏi một trong các bảng danh mục hệ thống, chạy lệnh sau đây từ một dòng lệnh DB2 (bạn phải có quyền SYSADM hoặc DBADM để làm việc này):

REVOKE SELECT ON SYSCAT.DBAUTH FROM PUBLIC

Bạn phải thu hồi quyền truy cập PUBLIC SELECT từ tất cả các bảng hệ thống mà bạn cảm thấy người dùng không thể được xem.

Bảng danh mục hữu ích

Tất nhiên, bảng danh mục DB2 nào cũng hữu ích, nhưng có một số ít trong số đó mà bạn có thể rất muốn truy vấn. Có trên 60 bảng danh mục hệ thống và chúng được mô tả chi tiết trong Tập 1 của tài liệu Tham khảo DB2 SQL. Một số khung nhìn đặc biệt hữu ích là:

  • SYSCAT.COLUMNS: Chứa một hàng cho mỗi cột (gồm cả các cột kế tục, nếu có thể được) mà được định nghĩa cho một bảng hoặc khung nhìn.
  • SYSCAT.INDEXCOLUSE: Liệt kê tất cả các cột mà tham gia vào một chỉ mục.
  • SYSCAT.INDEXES: Chứa một hàng cho mỗi chỉ mục (bao gồm các chỉ mục thừa kế, nếu có thể được) mà được định nghĩa cho một bảng.
  • SYSCAT.TABLES: Chứa một hàng cho mỗi bảng, khung nhìn, tên riêng, hoặc bí danh được tạo. Tất cả các bảng và khung nhìn danh mục có các mục trong khung nhìn danh mục SYSCAT.TABLES.
  • SYSCAT.VIEWS: Chứa một hoặc nhiều hàng cho mỗi khung nhìn được tạo.

Thí dụ, nếu bạn muốn xác định đó là các cột gì trong bảng EMPLOYEE, cùng với kiểu dữ liệu của chúng, độ dài, và độ lớn, thì bạn có thể chạy SQL sau đây để lấy ra thông tin này:

SELECT COLNAME, TYPENAME, LENGTH, SCALE FROM SYSCAT.COLUMNS
  WHERE TABNAME='EMPLOYEE'

Tất nhiên, bạn có thể chỉ cần sử dụng Trung tâm Điều khiển để xem thông tin này, nhưng một lệnh SELECT là hữu ích khi tạo một kịch bản lệnh cho phép tạo các thông tin này đối với một số bảng. Khung nhìn SYSCAT.VIEWS cũng đặc biệt hữu ích khi xác định tình trạng của các khung nhìn trong cơ sở dữ liệu.

Tóm tắt

Bảng danh mục hệ thống chứa thông tin về định nghĩa của các đối tượng cơ sở dữ liệu và thông tin bảo mật về kiểu truy cập mà người sử dụng có trên đối tượng này.

Tất cả các bảng danh mục hệ thống đều có quyền chọn truy cập PUBLIC. Đối với các mức độ bảo mật cao hơn, DBA có thể mong muốn thu hồi quyền truy cập PUBLIC đối với các đối tượng này.

Cuối cùng, bảng danh mục hệ thống chứa các thông tin hữu ích mà bạn có thể lấy ra bằng cách sử dụng các lệnh chọn SQL tiêu chuẩn. Việc sử dụng các lệnh SQL làm cho nó dễ dàng tạo các kịch bản lệnh cho phép lấy ra các thông tin về một số lớn các bảng, cột, chỉ mục, và các đối tượng khác cần được bảo trì.


Áp đặt tính duy nhất của dữ liệu

Áp đặt tính duy nhất của dữ liệu

Nhiều ứng dụng yêu cầu dữ liệu trong một bảng phải là duy nhất. Tính duy nhất này thường chỉ áp dụng cho một số cột nhất định trong hàng, thí dụ như một mã nhận dạng của nhân viên hoặc mã số đại lý bán hàng. Tính duy nhất này đảm bảo rằng bạn chỉ có một bản ghi đại diện cho mỗi cá nhân người sử dụng, giao dịch, hoặc hàng.

Cơ sở dữ liệu cũng cần khả năng áp đặt các hàng duy nhất trong một bảng. Để thực hiện tính toàn vẹn tham chiếu, bảng cha phải có các dòng duy nhất; nếu không thì quan hệ giữa các hàng con và hàng cha sẽ rất mơ hồ. Ngoài ra, không có dạng mẫu duy nhất và tính toàn vẹn tham chiếu này, DB2 không thể tối ưu hóa truy cập đến nhiều bảng trong một định dạng lược đồ hình sao. Rõ ràng là khả năng để có các dòng duy nhất là thiết yếu đối với nhiều ứng dụng cơ sở dữ liệu.

Tạo các bản ghi duy nhất

Bạn có thể bảo đảm rằng các hàng trong một bảng là duy nhất theo nhiều cách khác nhau:

Sử dụng một khoá chính. Trong khi tạo bảng, bạn có thể quy định rằng một cột là khóa chính của bảng đó:

CREATE TABLE EMPLOYEE 
  (
  EMPNO INT NOT NULL PRIMARY KEY, 
  LASTNAME VARCHAR(20) NOT NULL,
  ...
  )

Mệnh đề PRIMARY KEY trên định nghĩa cột báo cho DB2 biết để tự động tạo một chỉ mục mà sẽ áp đặt tính duy nhất của cột này. Ngoài ra, chỉ có một khoá chính cho toàn bộ bảng, như vậy không một cột nào khác có thể chứa mệnh đề này. Nếu nhiều cột là cần thiết để bảo đảm tính duy nhất của hàng đó, mệnh đề PRIMARY KEY phải làm theo định nghĩa bảng:

CREATE TABLE EMPLOYEE 
  (
  EMPNO INT NOT NULL, 
  LASTNAME VARCHAR(20) NOT NULL,
  ...,
  PRIMARY KEY (EMPNO, LASTNAME)
  )

Sử dụng mệnh đề UNIQUE. Mệnh đề UNIQUE cũng có thể được sử dụng để tạo các giá trị duy nhất trong một hàng. Mỗi cột với mệnh đề này sẽ là duy nhất:

CREATE TABLE EMPLOYEE 
  (
  EMPNO INT NOT NULL UNIQUE,
  SOCINS CHAR(11) NOT NULL UNIQUE,
  ...,
  )

Trong ví dụ này, cả mã số nhân viên và mã số bảo hiểm xã hội phải là duy nhất. Nói một cách khác, sẽ không có trường hợp hai người lại có cùng một mã số nhân viên, và không có hai người nào lại có cùng một mã số bảo hiểm xã hội. Để áp đặt tính duy nhất, DB2 tự động tạo hai chỉ mục, mỗi chỉ mục một cột.

Sử dụng một chỉ mục duy nhất. Cuối cùng, tính duy nhất cũng có thể được bảo đảm qua việc sử dụng một chỉ mục duy nhất. Lệnh CREATE INDEX có tuỳ chọn quy định rằng các giá trị phải là duy nhất trong cột (hoặc các cột) đang được lập chỉ mục:

CREATE UNIQUE INDEX UNIQUE_EMPLOYEE ON EMPLOYEE(EMPNO)

Chỉ mục này sẽ được tạo ngay sau khi tạo bảng. Nếu không sẽ có khả năng là các bản ghi sẽ được chèn vào bảng không phải là duy nhất. Nếu có trường hợp như vậy thì việc tạo chỉ mục sẽ thất bại vì có các bản ghi trùng lặp.

Loại bỏ các hàng trùng lặp

Có thể có trường hợp mà trong đó một số dữ liệu trong một bảng không phải là duy nhất. Đó có thể là do dữ liệu “bẩn”, là kết quả của việc tổng hợp nhiều nguồn dữ liệu, hoặc các cột được trả lại trong tập kết quả. Do dữ liệu không thể là duy nhất, bạn phải viện đến các kỹ thuật với SQL, cho phép loại bỏ được các hàng trùng lặp này.

Cách đơn giản nhất để loại bỏ các hàng trùng lặp từ một tập các kết quả là sử dụng từ khoá DISTINCT trong một lệnh chọn:

SELECT DISTINCT WORKDEPT FROM EMPLOYEE

Đối với nhiều tập trả lời được nhập vào với nhau, người sử dụng phải quy định rõ UNION chứ không phải là UNION ALL. UNION ALL không loại bỏ các trùng lặp trong tập trả lời, còn UNION thực hiện việc đó.

SELECT WORKDEPT FROM EMPLOYEE WHERE EMPNO > '000100'
  UNION
SELECT WORKDEPT FROM EMPLOYEE WHERE EMPNO < '000900'

Tóm tắt

Tính duy nhất có thể được đảm bảo trong bảng bằng cách sử dụng các khoá chính, các mệnh đề UNIQUE, hoặc các chỉ mục duy nhất. Tính duy nhất trong tập trả lời cũng có thể được đảm bảo bằng cách sử dụng mệnh đề DISTINCT trong một lệnh chọn, hoặc mệnh đề UNION với nhiều tập trả lời.


Kết luận

Tóm tắt

Hướng dẫn này đã bao hàm các chủ đề sau đây về quản trị cơ sở dữ liệu:

  1. Khả năng tạo các tác vụ DB2 bằng cách sử dụng các công cụ GUI.
  2. Kiến thức về việc tạo và quản lý các chỉ mục.
  3. Khả năng tạo các ràng buộc trên các bảng (ví dụ như RI, thông tin, tính duy nhất).
  4. Khả năng tạo các khung nhìn trên các bảng.
  5. Kỹ năng về kiểm tra nội dung của các bảng danh mục hệ thống.
  6. Kiến thức về cách áp đặt tính duy nhất của dữ liệu

Mặc dù tài liệu được trình bày trong hướng dẫn này đã cho bạn một cái nhìn tổng quát rất tốt về các chỉ mục, ràng buộc, tính toàn vẹn tham chiếu, và các khung nhìn, không có gì chuẩn bị cho bạn nhiều hơn để nhận được chứng chỉ là chính bạn phải thử nghiệm thực sự các lệnh này và làm việc trên một cơ sở dữ liệu thực. Trong khi nhiều tính năng này là không cần thiết để chạy cơ sở dữ liệu, việc sử dụng chúng sẽ tạo hiệu quả tốt hơn và cải thiện việc điều khiển qua chất lượng của dữ liệu của bạn.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • Một phiên bản thử nghiệm của DB2 9 có sẵn tải về miễn phí.
  • Tải về DB2 Express-C, một phiên bản miễn phí của DB2 Express Edition cho cộng đồng nó có cùng một đặc tính dữ liệu cốt lõi như bản DB2 Express Edition và cung cấp một cơ sở vững chắc để xây dựng và triển khai các ứng dụng.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Information Management
ArticleID=457841
ArticleTitle=Chuẩn bị kỳ thi số 731 lấy chứng chỉ DBA (Quản trị cơ sở dữ liệu) DB2 9, Phần 3: Truy cập cơ sở dữ liệu
publish-date=12182009