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
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,