2008-10-12 6 views
6

Tôi quan tâm đến phương thức ghi nhật ký thường xuyên trong cơ sở dữ liệu Oracle. Phương pháp của chúng tôi là:Làm cách nào để đăng nhập vào cơ sở dữ liệu Oracle?

Chúng tôi tạo bảng nhật ký cho bảng được ghi nhật ký. Bảng nhật ký chứa tất cả các cột của bảng gốc cộng với một số trường đặc biệt bao gồm dấu thời gian, loại sửa đổi (chèn, cập nhật, xóa), id của trình sửa đổi. Trình kích hoạt trên bảng ban đầu sẽ tạo một hàng nhật ký cho mỗi lần chèn và xóa và hai hàng cho một sửa đổi. Các hàng nhật ký chứa dữ liệu trước và sau khi thay đổi dữ liệu gốc.

Mặc dù nhà nước của các hồ sơ có thể được khai thác trở lại trong thời gian sử dụng phương pháp này, nó có một số nhược điểm:

  • Giới thiệu của một cột mới trong bảng ban đầu không tự động liên quan đến việc sửa đổi bản ghi.
  • Sửa đổi nhật ký ảnh hưởng đến bảng nhật ký và trình kích hoạt và rất dễ gây rối.
  • Trạng thái của một bản ghi tại một thời điểm cụ thể không thể được xác định một cách đơn giản.
  • ...

Khả năng khác tồn tại là gì? Loại công cụ nào có thể được sử dụng để giải quyết vấn đề này?

Tôi chỉ biết log4plsql. Ưu điểm/nhược điểm của công cụ này là gì?

Chỉnh sửa: Dựa trên câu trả lời của Brian Tôi đã tìm thấy reference sau đây giải thích kiểm tra hạt tiêu chuẩn và tốt.

Trả lời

10

Có vẻ như bạn đang sau khi 'kiểm tra'. Oracle có một tính năng tích hợp gọi là Fine Grain Auditing (FGA). Tóm lại, bạn có thể kiểm tra mọi thứ hoặc điều kiện cụ thể. Điều thực sự thú vị là bạn có thể chọn 'kiểm toán' cũng như giao dịch. Lệnh đơn giản để bắt đầu với việc kiểm tra:

audit UPDATE on SCOTT.EMP by access; 

Hãy coi đó là 'trình kích hoạt' cho các câu lệnh chọn. Ví dụ, bạn tạo các chính sách:

begin 
    dbms_fga.add_policy (
     object_schema=>'BANK', 
     object_name=>'ACCOUNTS', 
     policy_name=>'ACCOUNTS_ACCESS' 
); 
end; 

Sau khi bạn đã xác định chính sách, khi người dùng truy vấn bảng theo cách thông thường, như sau:

hồ sơ trail
select * from bank.accounts; 

kiểm toán hành động này. Bạn sẽ nhìn thấy dấu vết bằng cách phát hành:

select timestamp, 
    db_user, 
    os_user, 
    object_schema, 
    object_name, 
    sql_text 
from dba_fga_audit_trail; 

TIMESTAMP DB_USER OS_USER OBJECT_ OBJECT_N SQL_TEXT 
--------- ------- ------- ------- -------- ---------------------- 
22-OCT-08 BANK ananda BANK ACCOUNTS select * from accounts 
+0

không nhận được bạn trước và sau giá trị tho. Nó khá hạn chế. Ngoại trừ nó cung cấp cho bạn SELECTS mà bạn không thể nhận được từ các bảng được người dùng kiểm soát. –

+0

FGA sẽ giúp bạn nhận được trước và sau các giá trị. Đó là cách sử dụng rõ ràng của FGA. Tôi đã làm cho điểm mà FGA cũng có thể được sử dụng để theo dõi sử dụng lựa chọn. –

0

log4plsql là một điều hoàn toàn khác nhau, cho khai thác gỗ thông tin gỡ lỗi từ PL/SQL

Đối với những gì bạn muốn, bạn cần một trong hai.

  1. Thiết lập một kích hoạt
  2. Cài đặt giao diện PL/SQL xung quanh các bảng, các thao tác CRUD xảy ra thông qua giao diện này, giao diện đảm bảo các bản ghi bảng được cập nhật.
  3. Giao diện thiết lập trong lớp ứng dụng của bạn, như với giao diện PL/SQL, chỉ cao hơn.
  4. Oracle 11g chứa các bảng được phiên bản, tôi chưa sử dụng điều này chút nào, do đó, không thể đưa ra nhận xét thực sự.
2

Đánh giá từ mô tả của bạn, tôi tự hỏi nếu những gì bạn thực sự cần không phải là cơ chế ghi nhật ký, mà là một số loại giá trị lịch sử của một số bảng. Nếu đây là trường hợp, thì có lẽ bạn nên sử dụng một số loại thiết kế cơ sở dữ liệu tạm thời (sử dụng các trường VALID_FROM và VALID_TO). Bạn có thể theo dõi các thay đổi trong cơ sở dữ liệu bằng cách sử dụng các công cụ Oracle LogMiner.

Đối với kịch bản của bạn, tôi thà lưu trữ các dữ liệu thay đổi trong loại schema:

+----------------------------------------------------------------------------+ 
| Column Name   | Function            | 
+----------------------------------------------------------------------------+ 
| Id     | PRIMARY_KEY value of the SOURCE table    | 
| TimeStamp   | Time stamp of the action        | 
| User    | User who make the action        | 
| ActionType   | INSERT, UPDATE, or DELETE       | 
| OldValues   | All fields value from source table, seperated by '|' | 
| Newvalues   | All fields value from source table, seperated by '|' | 
+----------------------------------------------------------------------------+ 

Với loại hình này của bảng đăng nhập, bạn có thể dễ dàng xác định:

  • Thay đổi hành động lịch sử của hồ sơ cụ thể (sử dụng Id)
  • Tiểu sử cụ thể tại một số thời điểm trong

Tất nhiên, kiểu ghi nhật ký này không thể dễ dàng xác định tất cả các giá trị hợp lệ của bảng trong thời điểm cụ thể. Đối với điều này, bạn cần phải thay đổi thiết kế bảng của bạn thành Temporal Database Design.

+0

Tôi yêu thiết kế này bởi vì ... Tôi có thể cho bạn biết mọi thứ đã xảy ra hôm qua TỪ MỘT BẢNG. Tôi có thể cho bạn biết mọi thứ user_X đã làm, TỪ MỘT BẢNG. Với các bảng đổ bóng, bạn phải truy cập danh sách các bảng để phát triển các câu hỏi đó. –

+0

LogMiner có vẻ hứa hẹn với tôi nhưng nó đòi hỏi việc tạo ra một cơ sở dữ liệu khai thác, một từ điển và làm lại các bản ghi, do đó, việc cấu hình lại hệ thống là cần thiết. Sự khác biệt của logminer theo cách tiếp cận của chúng tôi ở trên là nó hiển thị các câu lệnh sql thay vì các giá trị cột. – rics

+0

Giản đồ được đề xuất tương tự như lược đồ của chúng tôi, ngoại trừ việc chúng tôi lưu trữ các giá trị cũ/mới trong các dòng riêng biệt. Dù sao khả năng khai thác dữ liệu không khác nhau. – rics

0

Nếu bạn chỉ muốn biết những gì các dữ liệu trông giống như trong thời gian qua bạn chỉ có thể sử dụng chức năng truy vấn hồi tưởng Oracles để truy vấn dữ liệu trong một thời gian cụ thể trong quá khứ. Làm thế nào đến nay trong quá khứ là phụ thuộc vào bao nhiêu không gian đĩa bạn có và bao nhiêu hoạt động cơ sở dữ liệu có. Mặt tươi sáng của giải pháp này là các cột mới tự động được thêm vào. Nhược điểm là bạn không thể truy vấn flashback qua các hoạt động ddl.