Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Firebird, Interbase > Журналирование операций (FB 2.0) |
Автор: Akella 5.2.2007, 16:29 | ||||||||||||||||
1. Вначале создаем функцию для чтения контекстных переменных
теперь для записи контекстных переменных
2. создаем саму таблицу журнала
3. Создаем процедуру для чтения глобальной переменной
для записи глобальной переменной
4. Создаем процедуру, которая будет записывать события в таблицу журнала
5. Создаем для КАЖДОЙ таблицы нашей базы данных триггеры такого вида
6. В приложении на форме ввода логина и пароля узнаем id пользователя и записываем USER_ID в контекстную переменную см. строку dm.fibDB.Execute('execute procedure sp_set_global_var(''USER_ID'','+IntToStr(UserData.UserID)+')');
Вот теперь даже если с помощью др. средства манипулировать данными в базе (как то IBExpert), и если UID не запишется, то client_ip точно запишеться. Если в поле client_ip будет запись в виде целого числа (например, 2864), то данными манипулировали по протоколу не IPv4, а по протоколу XNET. |
Автор: Akella 5.2.2007, 16:49 |
С одной стороны так делать не очень хорошо. В идеале нужно работать с системными учётными записями. Но в моем случае у меня в базе своя таблица пользователей, своя таблица групп пользователей и своя таблица прав доступа. |
Автор: Akella 7.2.2007, 12:47 | ||||
Потом добавляем вьюху
Добавлено @ 12:50 В приложении бросам на форму TQuery, там пишем запрос
В итоге такая картина ![]() |
Автор: LostAlly 9.2.2007, 09:00 |
Добрый день. Хорошая тема, у меня сейчас стоит примерно такая же задача. Точнее такая же потребность создавать свои таблицы пользователей групп и прав. Тупиком для меня стала задача - где хранить пользователя и пароль для подключения к БД? В принципе у меня была идея использовать пользователей БД но привязывать их к группам и правам в созданных мной таблицах. Но тогда возникает неприятная ситуация - пользователь может напрямую подключиться к БД, а этого я не хочу. Ваш вариант мне полностью подходит, как вы подключаетесь к БД? |
Автор: Romkin 9.2.2007, 10:04 |
Здесь тоже пользователь может подключиться напрямую к БД, все через SYSDBA ходят. Или уже нет? ![]() |
Автор: Akella 9.2.2007, 10:09 |
Romkin, я не пойму, чё ты пристал с этим одним пользователем...?? Моя база - что хочу, то и делаю, за то - больше возможностей. |
Автор: Romkin 9.2.2007, 10:15 |
Не с одним, а именно с SYSDBA. С одним, у которого минимальные права, я считаю что нормально. Сам, каюсь, грешен иногда, через SYSDBA доступ идет. Стараюсь закрывать, но за всем не уследишь ![]() Добавлено @ 10:19 Кстати, я вижу, что здесь у тебя при обновлении записывается старое значение ключа и новое. У тебя во всех таблицах при обновлении записи она добавляется что-ли? |
Автор: LostAlly 9.2.2007, 10:59 |
Это все понятно, не понятно одно, где в программе хранить пользователя БД которому разрешено цеплятся к базе. Ведь чтобы сделать селект пользователей из своей таблицы к базе нужно перед этим подключиться. И еще при подключении к базе в каком виде передается пароль базы данных. 2Romkin Не обязательно это должен быть пользователь SYSDBA, можно создать другого с нужным набором прав. |
Автор: Akella 9.2.2007, 12:51 | ||||
Нет, не ключа! Зачем? Допустим есть таблица-справочник: ID, NAME, EXP Пользователь сделал изменение записи. Вот при обновлении и видно какое значение поля NAME было, а какое стало. (В данном случае поле NAME - основное) Очень удобно. Конечно, если в таблице 50 полей, то все сохранять - это большая рутина и огромная база. Но если нужно хранить все изменения... то можно сделать дочернюю таблицу, где хранить изменения каждого поля. ID, ID_MASTER, FIELD_NAME, NEW_DATA, OLD_DATA. Добавлено @ 12:53
Это сам решай, можешь шифровать. |
Автор: Akella 9.2.2007, 13:07 | ||||
С помощью утилиты gsec создай в БД пользователя и работай под ним и подключайся к базе в клиентском приложении под ним. Смотри, коннектишься к базе под системным пользователем, загружаешь в выпадающий список формы-логина из СВОЕЙ таблицы пользователей все имена. Кроме имён пока тебе ничего не нужно. Загрузил и жди пока юзер введет пароль и нажмет ОК. Нажал ОК? проверяй пароль выбранного пользователя. делай запрос вида
если в поле значение "0", то знач пароль неверный. Добавлено @ 13:08 В твоей таблице USERS поле USER_NAME должно иметь только уникальные записи. |
Автор: LostAlly 13.2.2007, 14:01 |
Да это все и так понятно, просто боюсь хранить пароль к БД в программе. |
Автор: Akella 13.2.2007, 14:07 |
храни в базе в зашифрованном виде, шифруй без обратимого шифрования, или какой пароль? |
Автор: LostAlly 14.2.2007, 10:37 |
Пароль для обращения к БД. Допустим путь это будет тот же самый SYSDBA. Ведь чтобы добраться до самих пользователей(которые в моей таблице хранятся) мне нужно сначала подрубиться к БД. |
Автор: Akella 14.2.2007, 13:41 |
храни в программе, а что такого? Если тебе нужна безопасность, то тебе лучше использовать системных пользователей |
Автор: Akella 18.4.2007, 08:13 | ||||
Хочу предупредить про подводный камень, на который наткнулся при использовании программы со встраиваемым сервером. В LOG-таблице есть поле ClientIP, которое не может быть пустым(not null). Так вот, при использовании встраиваемого сервера. Код должен быть таким:
т.к. в хранимке функция возвращает null в этом случае (rdb$get_context('SYSTEM', 'CLIENT_ADDRESS')
Добавлено через 1 минуту и 4 секунды т.е. поле ClientIP должно допускать "пустое" значение. |
Автор: Akella 11.5.2007, 11:02 | ||
но можно ассоциировать свою и системную таблицы пользователей и групп |