Конференция "Базы" » аудит в БД [D7]
 
  • Natalinka © (15.05.14 20:31) [20]
    Дмитрий   (15.05.14 16:16) [18] Простите мою глупость...а как тогда в таблицу аудита попадут старые записи?
  • sniknik © (16.05.14 08:15) [21]
    > а как тогда в таблицу аудита попадут старые записи?
    а те которые раньше там были не в счет? ну вот начали "аудит", хотя это ближе к логированию, как сейчас понимаю, сразу скопировали всю таблицу в таблицу "аудита" и считаем первые записи "точкой отчета", дальше изменения. и получится по записьно если выбрать один код и сортировать по времени добавления - что было, что стало, и т.д. для каждой следующей предыдущая старая запись.
  • Кщд (16.05.14 12:30) [22]
    >Natalinka ©   (15.05.14 20:30) [19]
    для начала изучите базовые концепции: http://docs.oracle.com/cd/B19306_01/server.102/b14220/toc.htm
    хотя бы бегло

    ответьте себе на вопрос:
    Кщд   (15.05.14 12:45) [8]
    2. что будет в in_number, если два пользователя одновременно выполнят insert?
  • Natalinka © (16.05.14 12:38) [23]
    2. что будет в in_number, если два пользователя одновременно выполнят insert?  - ничего не будет..один пользователь.
  • Natalinka © (21.05.14 11:12) [24]
    Проблема моя решилась так..может кому пригодится


    unit Events_unit;

    interface

    uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants;

    type// добавляем параметры
       Taudit_params = Record
       material: AnsiString;     //параметр таблицы материал
       weight: Integer;         // параметр таблицы вес
     end;

    type
     TEvents_main=class(TObject)
       private

       public
         Str_SQL: array of AnsiString; //массив строк
         audit: Taudit_params;
         audit_need_save: Boolean;
         type_event: AnsiString;  // тип  события
         St: String;//добавление новой строки

    //если редактирование строки
    procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet);
    begin
    Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String;
    Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger;
    Smelt.type_event:='edit rec ferr'; // тип события редактирование

    // добавление новой строки (записи)
    procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet);
    begin
     Smelt.type_event:='insert rec ferr';
    SV.ferr:=1;
    end;


    procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet);
    var
    St: Integer; // строка
    begin
    if(Smelt.audit_need_save = false)then Exit;

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,St+1);
    Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) ';

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1);

    if(Smelt.type_event = 'insert rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');';
    end;

    if(Smelt.type_event = 'edit rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');';

    end;

    Smelt.type_event:= '';
    Smelt.audit.material:='';
    Smelt.audit.weight:=0;
    end;

    // ну и сам массив на кнопке "Сохранить"
    procedure Tadd_form.N2Click(Sender: TObject);
    var
    i:Integer;

    begin
    save_all_data(true);

    DataModule2.DataSet_material_audit.Close;
       DataModule2.DataSet_material_audit.SQL.Add('begin');
       for i:=0 to length(Smelt.Str_SQL)-1  do begin // добавление данных в таблицу аудита при помощи выполнения массива
       DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]);
           end;
       DataModule2.DataSet_material_audit.SQL.Add('commit;');
       DataModule2.DataSet_material_audit.SQL.Add('end;');
       DataModule2.DataSet_material_audit.Open;

     for i:=0 to length(Smelt.Str_SQL)-1  do begin  // чистим массив
       Smelt.Str_SQL[i]:='';
        end;

      Setlength(Smelt.Str_SQL, 0);

    end;    

    В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время.
    На удаление строки - делается аналогично.
    На удаление строки аналогично.
    Спасибо всем, кто откликнулся и помогал.
  • Natalinka © (21.05.14 11:12) [24]
    Проблема моя решилась так..может кому пригодится


    unit Events_unit;

    interface

    uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants;

    type// добавляем параметры
       Taudit_params = Record
       material: AnsiString;     //параметр таблицы материал
       weight: Integer;         // параметр таблицы вес
     end;

    type
     TEvents_main=class(TObject)
       private

       public
         Str_SQL: array of AnsiString; //массив строк
         audit: Taudit_params;
         audit_need_save: Boolean;
         type_event: AnsiString;  // тип  события
         St: String;//добавление новой строки

    //если редактирование строки
    procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet);
    begin
    Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String;
    Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger;
    Smelt.type_event:='edit rec ferr'; // тип события редактирование

    // добавление новой строки (записи)
    procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet);
    begin
     Smelt.type_event:='insert rec ferr';
    SV.ferr:=1;
    end;


    procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet);
    var
    St: Integer; // строка
    begin
    if(Smelt.audit_need_save = false)then Exit;

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,St+1);
    Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) ';

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1);

    if(Smelt.type_event = 'insert rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');';
    end;

    if(Smelt.type_event = 'edit rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');';

    end;

    Smelt.type_event:= '';
    Smelt.audit.material:='';
    Smelt.audit.weight:=0;
    end;

    // ну и сам массив на кнопке "Сохранить"
    procedure Tadd_form.N2Click(Sender: TObject);
    var
    i:Integer;

    begin
    save_all_data(true);

    DataModule2.DataSet_material_audit.Close;
       DataModule2.DataSet_material_audit.SQL.Add('begin');
       for i:=0 to length(Smelt.Str_SQL)-1  do begin // добавление данных в таблицу аудита при помощи выполнения массива
       DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]);
           end;
       DataModule2.DataSet_material_audit.SQL.Add('commit;');
       DataModule2.DataSet_material_audit.SQL.Add('end;');
       DataModule2.DataSet_material_audit.Open;

     for i:=0 to length(Smelt.Str_SQL)-1  do begin  // чистим массив
       Smelt.Str_SQL[i]:='';
        end;

      Setlength(Smelt.Str_SQL, 0);

    end;    

    В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время.
    На удаление строки - делается аналогично.
    На удаление строки аналогично.
    Спасибо всем, кто откликнулся и помогал.
  • Natalinka © (21.05.14 11:12) [24]
    Проблема моя решилась так..может кому пригодится


    unit Events_unit;

    interface

    uses Oracle, OracleData, Dialogs, SysUtils, Registry, Windows, Forms, Controls, DBGrids, Variants;

    type// добавляем параметры
       Taudit_params = Record
       material: AnsiString;     //параметр таблицы материал
       weight: Integer;         // параметр таблицы вес
     end;

    type
     TEvents_main=class(TObject)
       private

       public
         Str_SQL: array of AnsiString; //массив строк
         audit: Taudit_params;
         audit_need_save: Boolean;
         type_event: AnsiString;  // тип  события
         St: String;//добавление новой строки

    //если редактирование строки
    procedure TDataModule2.DataSet_ferrBeforeEdit(DataSet: TDataSet);
    begin
    Smelt.audit.material:=DataModule2.DataSet_ferr.FieldByName('Additional_Name').As String;
    Smelt.audit.weight:=DataModule2.DataSet_ferr.FieldByName('amount').AsInteger;
    Smelt.type_event:='edit rec ferr'; // тип события редактирование

    // добавление новой строки (записи)
    procedure TDataModule2.DataSet_ferrNewRecord(DataSet: TDataSet);
    begin
     Smelt.type_event:='insert rec ferr';
    SV.ferr:=1;
    end;


    procedure TDataModule2.DataSet_ferrAfterPost(DataSet: TDataSet);
    var
    St: Integer; // строка
    begin
    if(Smelt.audit_need_save = false)then Exit;

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,St+1);
    Smelt.Str_SQL[St]:='insert into develop.materials_audit(smelt_ident, number_processing, stage, material_kind, in_number, material_old, weight_old, event_time, material_new, weight_new, type_oper, familia) ';

    St:=length(Smelt.Str_SQL);
    Setlength(Smelt.Str_SQL,length(Smelt.Str_SQL)+1);

    if(Smelt.type_event = 'insert rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, NULL, NULL, sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''0'', '+char(39)+Curr_user.Familia+char(39)+');';
    end;

    if(Smelt.type_event = 'edit rec ferr')then begin
      Smelt.Str_SQL[St]:='values('+IntToStr(Smelt.SmI)+',1, '''+Smelt.Stage+''', ''1'', NVL((select max(in_number) from develop.materials_audit where smelt_ident='+IntToStr(Smelt.SmI)+'), 0)+1, '''+Smelt.audit.material+''', '+IntToStr(Smelt.audit.weight)+', sysdate, '''+ DataSet_ferr.FieldByName('additional_name').AsString+''',  '+DataSet_ferr.FieldByName('amount').AsString+', ''1'', '+char(39)+Curr_user.Familia+char(39)+');';

    end;

    Smelt.type_event:= '';
    Smelt.audit.material:='';
    Smelt.audit.weight:=0;
    end;

    // ну и сам массив на кнопке "Сохранить"
    procedure Tadd_form.N2Click(Sender: TObject);
    var
    i:Integer;

    begin
    save_all_data(true);

    DataModule2.DataSet_material_audit.Close;
       DataModule2.DataSet_material_audit.SQL.Add('begin');
       for i:=0 to length(Smelt.Str_SQL)-1  do begin // добавление данных в таблицу аудита при помощи выполнения массива
       DataModule2.DataSet_material_audit.SQL.Add(Smelt.Str_SQL[i]);
           end;
       DataModule2.DataSet_material_audit.SQL.Add('commit;');
       DataModule2.DataSet_material_audit.SQL.Add('end;');
       DataModule2.DataSet_material_audit.Open;

     for i:=0 to length(Smelt.Str_SQL)-1  do begin  // чистим массив
       Smelt.Str_SQL[i]:='';
        end;

      Setlength(Smelt.Str_SQL, 0);

    end;    

    В таблицу аудита при редактировании добавляются новые данные и фамилия пользователя и время, при редактирование в таблицу аудита вносятся данные старые+новые+фамилия пользователя+системное время.
    На удаление строки - делается аналогично.
    На удаление строки аналогично.
    Спасибо всем, кто откликнулся и помогал.
  • Кщд (21.05.14 12:02) [25]
    >Спасибо всем, кто откликнулся и помогал.
    жаль, что Вы не прислушались к советам
  • Кщд (21.05.14 12:02) [25]
    >Спасибо всем, кто откликнулся и помогал.
    жаль, что Вы не прислушались к советам
  • Кщд (21.05.14 12:02) [25]
    >Спасибо всем, кто откликнулся и помогал.
    жаль, что Вы не прислушались к советам
  • Natalinka © (21.05.14 12:24) [26]
    Кшд, прислушалась.. но в этом варианте только так приходится делать.
  • Natalinka © (21.05.14 12:24) [26]
    Кшд, прислушалась.. но в этом варианте только так приходится делать.
  • Natalinka © (21.05.14 12:24) [26]
    Кшд, прислушалась.. но в этом варианте только так приходится делать.
  • Кщд (21.05.14 13:09) [27]
    >Natalinka ©   (21.05.14 12:24) [26]
    обманываете всё...
    1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да?
    2. используйте параметры;
    3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки;
    4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?

    в целом, код унылый и нелепый
    справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли

    поэтому, Ваш код - пример того, как делать нельзя
    никому
    никогда
  • Кщд (21.05.14 13:09) [27]
    >Natalinka ©   (21.05.14 12:24) [26]
    обманываете всё...
    1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да?
    2. используйте параметры;
    3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки;
    4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?

    в целом, код унылый и нелепый
    справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли

    поэтому, Ваш код - пример того, как делать нельзя
    никому
    никогда
  • Кщд (21.05.14 13:09) [27]
    >Natalinka ©   (21.05.14 12:24) [26]
    обманываете всё...
    1. анонимный блок не нужен - это: begin insert... end; - Вы же справку не читаете, да?
    2. используйте параметры;
    3. вот такое получение уникального идентификатора: select max(in_number) from develop.materials_audit - это бред сивенькой такой кобылки;
    4. если 100 раз попытаться отредактировать запись, но не вносить никаких изменений, в базу 100 раз уйдут одни и те же данные?

    в целом, код унылый и нелепый
    справку, даже в базовой части, ни по Delphi, ни по Oracle Вы так и не открыли

    поэтому, Ваш код - пример того, как делать нельзя
    никому
    никогда
  • Кщд (21.05.14 13:15) [28]
    >Кщд   (21.05.14 13:09) [27]
    и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
  • Кщд (21.05.14 13:15) [28]
    >Кщд   (21.05.14 13:09) [27]
    и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
  • Кщд (21.05.14 13:15) [28]
    >Кщд   (21.05.14 13:09) [27]
    и, напоследок, с учётом вставки в бешенном количестве никому не нужных данных: как только Ваша таблица(materials_audit) разрастётся, вставка в неё(в Вашем исполнении) будет занимать весьма продолжительное время
  • Natalinka © (21.05.14 13:38) [29]
    в курсе..но это службу безопасности не волнует, сказали хотим так - получили..раз в месяц данные будут удаляться из базы аудит
 
Конференция "Базы" » аудит в БД [D7]
Есть новые Нет новых   [118645   +50][b:0][p:0.001]