Модераторы: Akella
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> протоколирование действий пользователей, FB 1.5 
:(
    Опции темы
TheCetus
Дата 28.3.2006, 18:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



Кто сталкивался со следующей задачей: необходимо вести протоколирование действи пользователей. Т.е фиксировать удаление, добавление, модификацию данных и другие действия следующим образом: в определенную табличку на базе записывать имя пользователя производившего действия из системной таблицы users, и данные об операции. Все манипуляции с БД идут через хранимые процедуры, поэтому тип операции определить не сложно.
1. Как определить момент подключения и отключения от БД и зафиксировать его?
2. Как определить имя подключившегося пользователя?
3. Есть еще какие-нибудь предложения по реализации?
PM MAIL   Вверх
TheCetus
Дата 29.3.2006, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



Как в хранимой процедуре на сервере определить имя пользователя вызвавшего процедуру?
PM MAIL   Вверх
TheCetus
Дата 29.3.2006, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



три дня поисков увенчались успехом. Есть контекстная переменная user
имя пользователя можно получить следующим образом:
select user from rdb$database into :puser_name
PM MAIL   Вверх
TheCetus
Дата 30.3.2006, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 134
Регистрация: 9.3.2006

Репутация: нет
Всего: 2



Alex, думаю есть резон поместить этот вопрос с фАК
PM MAIL   Вверх
xgm
Дата 30.3.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 10.8.2005

Репутация: 1
Всего: 1



Может CURRENT_USER ?
PM MAIL   Вверх
vv3
Дата 12.5.2006, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 29.4.2006

Репутация: нет
Всего: нет



Код

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)
За счет таких таблиц можно даже кое-какие неверные изменения откатить...  
PM MAIL   Вверх
Akella
Дата 15.5.2006, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 20
Всего: 329



У меня по-другому:
сделана таблица пользователей прямо в базе, ну получается так, что все пользователи фактически работают под одним именем, только они об этом не знают. У вот в таблице есть имя пользователя, пароль и код.
Можно сделать отдельную таблицу действий и туда записывать код пользователя, имя таблицы, ID записи и действие. У меня пишется всё через клиентское приложение. 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Interbase"
Alex

Обязательно указание:

1. Версию InterBase (Firebird, Yaffil)

2. Способа доступа (ADO, BDE, IBX и т.д.)

  • КАК ПРАВИЛЬНО ОФОРМИТЬ КОД - ЗДЕСЬ
  • КАК ПРАВИЛЬНО УКАЗАТЬ ТЕКСТ ОШИБКИ - ЗДЕСЬ
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • FAQ раздела лежит здесь!

Если Вам понравилась атмосфера форума, заходите к нам чаще! С Уважением, Akella.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Firebird, Interbase | Следующая тема »


 




[ Время генерации скрипта: 0.1028 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.