| Код | CREATE TABLE LOG_ACCESS_TO_BASE( ACCESS_TIME TIMESTAMP, USER_NAME VARCHAR(31), ACCESS_TYPE SMALLINT);
|
| Код | CREATE PROCEDURE LOG$USER( IACCESSTYPE INTEGER) AS BEGIN INSERT INTO LOG_ACCESS_TO_BASE(ACCESS_TIME, USER_NAME VARCHAR, ACCESS_TYPE) VALUES('NOW', CURRENT_USER, :IACCESSTYPE); END
|
| Код | //Записываем в лог-таблицу вход procedure DataModule1.IBDatabase1AfterConnect(Sender: TObject); begin
//IBSQL1.SQL:= 'EXECUTE PROCEDURE LOG$USER(:IACCESTYPE)'; содержимое TIBSQL
if not IBSQL1.Transaction.Active then IBSQL1.Transaction.StartTransaction; IBSQL1.Params[0]:= 1; //вход будет 1, выход -1 IBSQL1.ExecQuery; IBSQL1.Transaction.Commit; end;
//Записываем выход procedure DataModule1.IBDatabase1BeforeDisconnect(Sender: TObject); begin if not IBSQL1.Transaction.Active then IBSQL1.Transaction.StartTransaction; IBSQL1.Params[0]:= -1; //вход будет 1, выход -1 IBSQL1.ExecQuery; IBSQL1.Transaction.Commit; end;
|
Что касается вносимых юзером изменений, то я на все интересующие меня таблицы делаю их дубликаты по следующей схеме:
| Код | CREATE TABLE ITEM( /*оригинальная таблица*/ ITEM_ID INTEGER NOT NULL, ITEM_NAME VARCHAR(250), и т.д.);
|
| Код | CREATE TABLE LOG_ITEM( /*лог-таблица*/ LOG_ITEM_ID INTEGER NOT NULL, LOG_TIME TIMESTAMP, LOG_OPERATION CHAR(1), /*I<nsert>, D<elete>, U<pdate>*/ LOG_USER VARCHAR(31), /*виновник торжества - CURRENT_USER*/ OLD_ITEM_ID INTEGER, /*старое значение*/ NEW_ITEM_ID INTEGER, /*новое значение*/ OLD_ITEM_NAME VARCHAR(250), NEW_ITEM_NAME VARCHAR(250) и т.д.);
|
и записываю в нее через триггера AFTER_UPDATE(INSERT, DELETE) За счет таких таблиц можно даже кое-какие неверные изменения откатить... |