2.1.1. Khái niệm cơ sở dữ liệu tích cực
Cơ sở dữ liệu tích cực là một CSDL bao gồm tập quy tắc được tự động kích hoạt bằng các sự kiện đã được thực hiện một hành động. Quy tắc đó được gọi là quy tắc ECA. Tuy nhiên, nhiều nghiên cứu mà trong đó một mô hình tổng quát cho các cơ sở dữ liệu tích cực có thể nhìn thấy đã được làm từ các mô hình trigger trước đó đã được đề nghị.
2.1.2. Quy tắc ECA
2.1.2.1. Sự kiện (Event)
Một sự kiện là một điều gì đó xảy ra ở một thời điểm. Bởi vậy, việc xác định một sự kiện bao gồm cả việc mô tả sự việc xảy ra được giám sát. Bản chất của việc mô tả và cách thức mà theo đó sự kiện có thể được phát hiện rộng rãi phụ thuộc vào nguồn (Source) hoặc đối tượng phát sinh sự kiện [5]. Các lựa chọn có thể là:
- Các hành động cấu trúc, trong trường hợp sự kiện được sinh ra bằng một hành động ở một phần của cấu trúc (ví dụ như: thêm bản ghi, sửa một thuộc tính, truy cập vào 1 bản ghi).
- Lời kêu gọi hành vi, trong trường hợp sự kiện được sinh ra bởi việc thực hiện một vài hành động của người dùng (ví dụ, thông điệp hiển thị được gửi tới một đối tượng kiểu widget). Đối với các ngôn ngữ sự kiện thường cho phép các sự kiện xuất hiện trước hoặc sau một hành động nào đó thực thi.
- Sự thực thi (giải quyết), trong trường hợp khi sự kiện được sinh ra bằng các lệnh thực thi (ví dụ, từ chối abort, ủy thác commit, bắt đầu thực thi begin – transaction)
- Trừu tượng hoặc người dùng định rõ, trong trường hợp một cơ chế lập trình được sử dụng cho phép một chương trình ứng dụng báo hiệu sự xuất
hiện một sự kiện rõ ràng (ví dụ trong phản hồi một vài thông tin mà người dùng nhập vào).
- Ngoại lệ (loại trừ ra), trong trường hợp sự kiện được sinh ra như là kết quả của một vài ngoại lệ phát sinh (ví dụ như, sự cố gắng truy cập một vài dữ liệu mà không có sự cho phép thích hợp).
- Đồng hồ, trong trường hợp sự kiện được sinh ra ở một điểm thời gian, sự kiện thời gian tương đối và chu kỳ được báo cáo trong tài liệu
- Ngoài ra, trong trường hợp sự kiện được sinh ra bởi sự việc xảy ra bên ngoài cơ sở dữ liệu (ví dụ, nhiệt độ dọc lớn hơn 30 độ).
Một sự kiện biểu thị một sự kiện được xác định cho tất cả các đối tượng trong một tập hợp hay không (ví dụ, tất cả các đối tượng thuộc một lớp), đối với các tập hợp con đã cho (ví dụ như, tất cả các nhân viên trừ giáo sư) hoặc đối với một số thành viên nhất định của tập hợp (ví dụ, để tránh việc truy cập trái phép tới các đối tượng xác định, hoặc cho phép cập nhật các đối tượng cụ thể hiển thị trên màn hình).
Các kiểu sự kiện có thể là:
- Gốc (nguyên thủy), trong trường hợp này sự kiện được sinh ra bởi sự việc đơn lẻ ở tầng thấp thuộc một trong những loại được mô tả ở nguồn (Source). Ví dụ, sự kiện “on insert to Owns” theo dõi việc thêm những bản ghi mới vào quan hệ “Owns”.
- Hỗn hợp, trong trường hợp này sự kiện được sinh ra bởi sự kết hợp các sự kiện hoặc hỗn hợp bằng cách sử dụng một loạt các toán tử cấu thành lên sự kiện.
Các toán tử sự kiện khác nhau tùy vào hệ thống. Phổ biến là:
Toán tử tách rời(disjunction) – E1 or E2 xuất hiện khi một trong các
thành phần E1 hoặc E2 xuất hiện;
Toán tử kết hợp (conjunction) – E1 and E2 xảy ra khi cả hai E1 và E2
đều xảy ra theo thứ tự bất kỳ;
Toán tử nối tiếp (sequence)– seq(E1,E2) xuất hiện khi E1 xuất hiện
đầu tiên E ra tín hiệu, không cần chú ý tới sự xuất hiện sau đó của E trong một khoảng thời gian Int,
Toán tử sử học (history) – times(n,E) in Int báo hiệu khi sự kiện E xuất hiện n lần trong khoảng thời gian Int;
Phủ định (not) – not E1 in Int phát hiện sự không xuất hiện của sự E1
trong khoảng thời gian Int.
Như một ví dụ của của quy tắc với sự kiện hỗn hợp, quy tắc sau thực hiện sự ràng buộc mà thuộc tính qty của stock là như nhau bằng số lượng được ghi vào quan hệ Owns:
on update to qty of Holder or update to qty of Stock or insert to Stock or delete to Stock or insert to Holder or delete to Holder If exists (select * from Stock where qty # (
select sum (qty) from Owns
where Owns.reg# =Stock-.reg#) )
do abort
Như một ví dụ thêm, để xác định giá cổ phiểu bị thay đổi hay không trong ngày làm việc sự kiện có thể được sử dụng: on update to price of Stock in
Đại số sự kiện phong phú có thể đề xuất cho một loạt các hệ thống, bao gồm HiPAC [Dayal et al. 1988], SAMOS [Gatziu và Dittrich 1994], ODE [Gehani et al.1992] và Sentinel [Chakravarthy et al.1994].
Khi phát hiện những sự kiện hỗn hợp, có vài sự kiện xuất hiện (của cùng một loại sự kiện) có thể được sử dụng để hình thành nên một sự kiện hỗn hợp. Ví dụ như, hãy xem xét một sự kiện hỗn hợp CE mà là sự nối tiếp của hai sự kiện EV1 và EV2. Nếu cả hai sự xuất hiện của sự kiện EV1, đầu tiên là ev1 và sau đó là
ev1’, được báo hiệu, và sự xuất hiện của sự kiện EV2 (ví dụ, ev2) bây giờ được
tạo ra, có một câu hỏi là trường hợp nào của CE sẽ được tạo ra. Khả năng bao gồm sequence(ev1,ev2) hoặc sequence(ev1’,ev2) hoặc sequence(ev1,ev2)
sequence(ev1’,ev2) . Các sự lựa chọn là phân biệt với nhau bằng cách sử dụng
các điều khoản tiêu thụ. Trong Chakravarthy et al.[1994] tồn tại 4 điều khoản tiêu hủy được trình bày là: ngữ cảnh gần đây, xem xét phần lớn tập hợp sự kiện gần đây mà có thể được sử dụng để xây dựng lên sự hỗn hợp ( trong ví dụ trước,
sequence(ev1’,ev2) được phát hiện khi ev2 xuất hiện, sau khi ev1’ và ev2 không còn được xét để phát hiện CE nữa); ngữ cảnh liên tục, nó xác định cửa sổ trượt và bắt đầu kết hợp với mỗi sự kiện nguyên thủy diễn ra (2 sự kiện nối tiếp bắt đầu được hình thành khi ev1 và ev1’ xuất hiện, và cả hai sự kiện nối tiếp sẽ được báo hiệu như là ev2 được phát hiện); và ngữ cảnh tích lũy, chất đống tất cả các sự kiện nguyên thủy đến khi sự kiện ghép lại xuất hiện (sự kiện nối tiếp được báo chỉ một lần khi ev2 sinh ra, ở nơi tham số đầu tiên của sự nối tiếp chứa các tham số của tất cả sự xuất hiện của EV1, tức là ev1 và ev1’). Nhân tố cơ bản cho mỗi ngữ cảnh có thể được tìm thấy ở Chakravarthy et al.[1994].
Vai trò của một sự kiện biểu thị các sự kiện phải luôn được định sẵn cho các quy tắc tích cực hay không, hoặc việc đặt tên rõ ràng của một sự kiện có cần thiết hay không. Nếu vai trò là tùy ý, thì khi mà không một sự kiện nào được xác định thì các quy tắc điều kiện - hành động được hỗ trợ, các quy tắc đó có chức năng khác nhau đáng kể và thực thi từ quy tắc sự kiện - điều kiện - hành động (ECA). Nếu như vai trò là none thì các sự kiện có thể không được định rõ, và tất
cả các quy tắc là quy tắc điều kiện – hành động. Nếu vai trò là bắt buộc, thì chỉ quy tắc ECA được hỗ trợ.
Hình 2.1 Ngữ cảnh mà trong đó một quy tắc được xử lý
2.1.2.2. Điều kiện (Condition)
Vai trò của một điều kiện biểu thị đã quy định hay chưa. Trong các quy tắc ECA, điều kiện thông thường là tùy chọn. Khi không điều kiện nào được quy định cho một quy tắc ECA, dẫn đến một quy tắc sự kiện – hành động. Trong các hệ thống mà ở đó cả sự kiện và điều kiện là tùy chọn, thì đó luôn là trường hợp mà ít nhất một cái được quy định [5].
Ngữ cảnh biểu thị sự thiết lập mà trong đó điều kiện được đánh giá. Các thành phần khác nhau của một quy tắc không được đánh giá trong sự độc lập trong cơ sở dữ liệu hoặc từ mỗi thành phần khác, và hơn nữa cũng có thể không được đánh giá lần lượt. Kết quả là, việc xử lý một quy tắc đơn lẻ có thể được liên kết với ít nhất 4 trạng thái cơ sở dữ liệu khác nhau: – cơ sở dữ liệu ở thời điểm bắt đầu của sự thực thi hiện thời; – cơ sở dữ liệu khi sự kiện đã diễn ra, – cơ sở dữ liệu khi điều kiện được đánh giá; và – cơ sở dữ liệu khi hành động được thực hiện. Hệ thống quy tắc tích cực có thể hỗ trợ các công cụ bên trong điều kiện của quy tắc mà cho phép nó có thể không truy cập tới hoặc nhiều hơn các trạng thái và, , và có thể cũng cho phép truy cập tới các ràng buộc liên kết với sự kiện . Các thông tin có sẵn được dùng với các thành phần khác nhau của một quy tắc được minh họa ở Hình 2.1. Nhìn chung, vị trí của các thành phần còn phức tạp hơn trong miêu tả ở Hình 2.1, bởi
vì trạng thái trước và sau một sự kiện diễn ra có thể khác nhau, và bởi vì nhiều sự kiện có thể được bắt đầu và có thể thực hiện tới khi hoàn thành trong khi thực hiện một hành động đơn lẻ. Như là một ví dụ tính tiện ích của thông tin đó, quy tắc sau được sử dụng để phản hồi lại tình huống trong đó giá trị của cổ phần nắm giữ bởi cổ đông (Holder) giảm về 0.
on update tovalue of Holder If new.value = 0
do (action)
Trong quy tắc này, thông tin từ sự kiện ( được sử dụng để xác định khi nào trường value được thiết lập bằng 0, do đó việc phản hồi thích hợp có thể được tạo ra (ví dụ, cổ đông Holder được xóa, thông tin về cổ đông Holder được gửi tới người quản lý quỹ). Một ví dụ khác, các điều kiện hay hành động truy cập tới tham số sự kiện sử dụng old chuyển đến giá trị mà một mục dữ liệu nắm giữ trước một sự kiện cập nhật nó, insert dẫn tới giá trị mới được chèn vào, delete là việc dẫn tới một giá trị hiện tại bị xoá và cập nhật liên quan tới các thuộc tính của một mục dữ liệu mà chúng không bị ảnh hưởng bởi sự kiện cập nhật.
2.1.2.3. Hành động (Active)
Phạm vi các công việc mà có thể được thực hiện bởi một hành động được chỉ rõ như là sự lựa chọn của nó. Các hành động có thể cập nhật theo cấu trúc của cơ sở dữ liệu hoặc quy tắc thiết lập, thực hiện hành động lấy thông tin từ cơ sở dữ liệu và thông báo người dùng hoặc quản trị hệ thống trong một vài tình huống, hủy bỏ giao dịch, hoặc lấy một số quy tắc phụ của hành động sử dụng trong do-instead [Stonebraker et al.1990]. Sau đây là một ví dụ của do-instead,
nếu muốn cố xóa đi giá trị từ quan hệ Holder mà có giá trị value > 0, sau đó cho phép hành động được thực hiện, người quản lý hệ thống có thể được thông báo hành động đó:
on delete to Holder if delete.value > 0
Khác với nhiều cú pháp chuẩn, trong trường hợp này bản ghi được xóa đi và người quản lý hệ thống được thông báo:
on delete to Holder if delete.value > 0
do (inform system manager)
Ngữ cảnh của hành động gần giống với ngữ cảnh của điều kiện, và biểu thị thông tin sẵn có về hành động, như trong minh họa ở Hình 2.1. Đôi khi thông tin có thể được chuyển từ điều kiện của quy tắc sang hành động, như ( hoặc ( . Sau đây là một ví dụ về sự tiện ích của thông tin ngữ cảnh, quy tắc sau được sử dụng để sửa lại thông tin lưu trữ trong thuộc tính value của tất cả bản ghi Holder mà bị ảnh hưởng bởi sự thay đổi price của vài Stock.
On update to price of Stock If true
Do update Holder
Set value = value*(new.price/old.price)
Where reg# in (select reg# from Owns where stock# = update.stock#)
Trong quy tắc này, cả giá trị old và new của price đều được truy cập tới ( , để làm trạng thái của cơ sở dữ liệu tại thời gian của cập nhật ( .
2.2. MÔ HÌNH TỔNG QUÁT VÀ CÁC TRIGGER TRONG ORACLE 2.2.1. Mô hình tổng quát của CSDL tích cực: 2.2.1. Mô hình tổng quát của CSDL tích cực:
Mô hình được sử dụng để chỉ rõ các quy tắc của cơ sở dữ liệu tích cực được tham chiếu đến như là mô hình ECA (Event-Condition-Active). Một quy tắc trong mô hình ECA có 3 thành phần:
a. Sự kiện (Event) làm kích hoạt quy tắc: các sự kiện này thường là các thao tác cập nhật cơ sở dữ liệu được áp dụng một cách tường minh đối với cơ sở dữ liệu. Tuy nhiên, trong mô hình tổng quát chúng cũng có thể là các sự kiện thời gian hoặc là các dạng sự kiện ngoài khác.
b. Điều kiện (Condition) xác định hành động của quy tắc có thể được thực hiện hay không: mỗi khi sự kiện kích hoạt có mặt, một điều kiện được chọn
có thể được tính giá trị. Nếu không có điều kiện nào được chỉ rõ, hành động sẽ được thực hiện sự kiện xảy ra. Nếu điều kiện được chỉ rõ, đầu tiên nó được tính giá trị và chỉ khi nó tính giá trị là đúng (true) thì hành động của quy tắc sẽ được thực hiện.
c. Hành động (Action) thực hiện: Hành động thường là một dãy lệnh SQL nhưng nó cũng có thể là một giao tác cơ sở dữ liệu hoặc một chương trình bên ngoài sẽ được thực hiện một cách tự động.
Hãy xem một vài ví dụ minh họa khái niệm này. Có hai quan hệ NHÂN VIÊN và ĐƠN VỊ. Mỗi nhân viên có một tên (tenNV), mã số (masoNV), lương, mã số đơn vị (masoDV) là khóa ngoài tham chiếu đến DONVI, và mã số người giám sát (MasoNGS) là khóa ngoài đệ quy đến NHANVIEN. Với ví dụ này, chúng ta giả thiết rằng masoNV có thể cho phép có giá trị null, chỉ ra rằng nhân viên có thể tạm thời chưa được đăng ký vào đơn vị nào. Mỗi đơn vị có một tên (TenDV), một mã số (MasoDV), tổng lương của tất cả các nhân viên đăng ký vào đơn vị (Tongluong) và một người quản lý (MasoNQL) là khóa ngoài đến NHANVIEN.
Chú ý rằng thuôc tính Tongluong thực chất là một thuộc tính suy diễn được, giá trị của nó là tổng lương của tất cả các nhân viên đăng ký vào một đơn vị cụ thể. Việc duy trì giá trị đúng của một thuộc tính suy diễn được như vậy có thể được thực hiện thông qua một luật tích cực. Trước tiên chúng ta phải xác định các sự kiện có thể gây ra một thay đổi giá trị của Tongluong, đó là các sự kiện sau:
[1]. Chèn vào một hoặc nhiều bộ giá trị nhân viên mới [2]. Thay đổi lương của một hoặc nhiều nhân viên có sẵn
[3]. Thay đổi việc đăng ký của các nhân viên có sẵn từ đơn vị này sang đơn vị khác.
[4]. Loại bỏ một hoặc nhiều bộ giá trị nhân viên.
Trong trường hợp sự kiện 1, chúng ta chỉ cần tính lại Tongluong nếu nhân viên mới được ghi tức khắc vào một đơn vị - nghĩa là giá trị của thuộc tính MasoNV đối với bộ nhân viên mới là khác null (giả thiết null là cho phép đối
với MasoNV). Như vậy điều đó sẽ là điều kiện để kiểm tra. Một điều kiện tương tự có thể sẽ được kiểm tra cho sự kiện 2 (và 4) để xác định xem có phải là nhân viên mà lương của anh ta bị thay đổi (hoặc bị xóa) hiện tại đã được đăng ký vào một đơn vị hay không. Với sự kiện 3, chúng ta luôn luôn thực hiện một hành động để duy trì giá trị của Tongluong một cách đúng đắn, như vậy là không cần điều kiện nào (hành động luôn luôn được thực hiện).
Hành động đối với các sự kiện 1, 2 và 4 là cập nhật một cách tự động giá trị của Tongluong đối với đơn vị của nhân viên để phản ánh việc lương của nhân viên vừa mới được thêm, xóa hoặc cập nhật. Trong trường hợp của sự kiện 3,