|
|
su.dbms.sql- SU.DBMS.SQL ------------------------------------------------------------------ From : Tolik Gusin 2:5020/400 19 Mar 2001 21:32:19 To : All Subject : Re: безопасность превыше всего? --------------------------------------------------------------------------------
Hi Victor,
> SP не подойдут хотя бы из-за наличия этих самых legacy applications.
> Стало быть - только триггеры. Только не подсчетами пускай занимаются, а
> журналы изменений ведут. Т.е. для любой таблицы X должна существовать
> таблица BACKUP_X, имеющая все колонки X и еще парочку-троечку (тип
> изменения, время изменения, кто произвел изменения и т.п.) и триггеры
> AFTER UPDATE и AFTER DELETE. Тогда можно будет не только узнать, кто
> сделал гадость, но и выборочно откатить какие-то операции. [Конечно,
> подтормаживать будет, и места займет многоЮ но ничего бесплатного не
> бывает].
Я тоже пользовался такой системой логов, единственное что я логировал
таким образом только главные (наиболее важные) таблицы. Hо с недавнего
времени (когда мне понадобилось вести лог по всем таблицам) я стал вести
лог по другому, через универсальную таблицу такой структуры:
CREATE TABLE "DBA"."LOGTABLE"
(
"ID" timestamp NOT NULL DEFAULT timestamp,
"USERNAME" char(15) NOT NULL DEFAULT current user,
"TABLENAME" char(20) NOT NULL,
"TABLEID" integer NOT NULL,
"TEXTSQL" varchar(1024) NOT NULL,
"NOTE" varchar(50) NULL,
PRIMARY KEY ("ID")
)
Думаю из названий полей понятно их назначение.
TABLEID - это ПК таблицы данные которой мы пишем в лог
TEXTSQL - это SQL команда которая выполнялась над таблицей TABLENAME.
В эту таблицу пишеться лог со всех таблиц базы.
В соответвующих триггерах таблиц стоит формирования SQL комманды,
которая сейчас произошла
и эта команда записываеться в LOGTABLE.
Вот примеры этих тригеров:
create trigger "dba".LogNewDistrict after insert order 1 on
"DBA".DISTRICT
referencing new as new_f
for each row
begin
declare cSQL char(1024);
set cSQL='insert into dba.DISTRICT(DISTRICTNAME) values(';
set cSQL=cSQL||CreateStr(new_f.DISTRICTNAME)||')';
call "dba".LogTableNew('DISTRICT',new_f."IDENTITY",cSQL,'insert')
end
create trigger "dba".LogEditDistrict after update order 1 on
"DBA".DISTRICT
referencing new as new_f
for each row
begin
declare cSQL char(1024);
set cSQL='update dba.DISTRICT set ';
set cSQL=cSQL||'DISTRICTNAME='||CreateStr(new_f.DISTRICTNAME)||' where
IDENTITY='
||CreateInt(new_f."IDENTITY");
call "dba".LogTableNew('DISTRICT',new_f."IDENTITY",cSQL,'update')
end
create trigger "dba".LogDelDistrict after delete order 1 on
"DBA".DISTRICT
referencing old as old_f
for each row
begin
declare cSQL char(1024);
set cSQL='delete from dba.DISTRICT where
IDENTITY='||CreateInt(old_f."IDENTITY");
call "dba".LogTableNew('DISTRICT',old_f."IDENTITY",cSQL,'delete')
end
CreateInt, CreateStr это функций который созданы для упрощения
формирования строки.
Соотвественно я для себя сделал универсальный читатель логов с помощью
которого я могу удобно смотреть что у меня происходит в таблицах.
Мне кажется что этот способ более удобен, чем создание дублей для каждой
таблицы.
Hо очень хотелось бы услышать мнения All по поводу этой системы ведения
логов.
--
С Уважением, Stalker E-mail: stalker732_4@yahoo.com
stalker4@mail.ru
FIDO: 2:464/732.4
ICQ: 28177787
Origin: The History is Dead
--- ifmail v.2.15dev5
* Origin: Alkar Teleport News Server (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /su.dbms.sql/408399f4d8d7.html, оценка из 5, голосов 10
|