Конференция "Базы" » как вычитать isert'ы, произошедшие в триггере одной из таблиц [D7, FB2.1]
 
  • TheEd (01.04.09 09:15) [0]
    Уважаемые мастера!
    Есть таблица А, при добавлении в неё записи в тригере АбифоИнсерт в таблицу Б вставляется ряд записей, связанных с таблицей А.
    так вот трабл: без DB.Close / DB.Open не вижу изменений :(

    использую fibPlus, у которого есть DefaultUpdateTransaction, пытался сделать CommitRetaining, но видимо изменения идут в контексте транзакции на сервере, и изменения хрен видны.

    Как их увидеть не разрывая связь с базой?
  • Медвежонок Пятачок © (01.04.09 09:46) [1]
    завершить и начать снова читающую транзакцию
  • Виталий Панасенко (01.04.09 09:50) [2]

    > TheEd   (01.04.09 09:15)  

    а откуда НД таблицы Б знает о том, что триггер что-то вставил? абсолютно ничего не знает.. если это мастер-деталь, то сделать FullRefresh для Б. Да, в принципе, даже если не мастер-деталь, тоже поможет FullRefresh.. но если данных много.. сам понимаешь...
  • TheEd (01.04.09 10:04) [3]

    > завершить и начать снова читающую транзакцию

     TA_read.Active := false;
     TA_read.Active := true;

    если так (?) то все НД закроются, а этого крайне нежелательно.


    > тоже поможет FullRefresh..

    не помогает :(
  • Медвежонок Пятачок © (01.04.09 10:07) [4]
    если так (?) то все НД закроются, а этого крайне нежелательно.

    Желательнее нихрена не видеть?
  • Sergey13 © (01.04.09 10:15) [5]
    > [0] TheEd   (01.04.09 09:15)
    > без DB.Close / DB.Open

    А что такое тут DB? Если датасет так обозвал - то это нормально.
  • TheEd (01.04.09 10:19) [6]

    > Желательнее нихрена не видеть?

    чую носом что можно "не отрывая глаз" увидеть...


    > А что такое тут DB? Если датасет так обозвал - то это нормально.

    DB : TpFIBDataBase
    и как нормально? :S
  • Виталий Панасенко (01.04.09 10:53) [7]
    если 2 транзакции (читающая и Update), то для НД нужно указать AutoCommit=TRue, тогда после каждого изменения будет происходить commit для Update транзакции. но читающая будет открытой...
    > TheEd   (01.04.09 10:04) [3]
    >
    >
    > > завершить и начать снова читающую транзакцию
    >
    >  TA_read.Active := false;
    >  TA_read.Active := true;
    >
    > если так (?) то все НД закроются, а этого крайне нежелательно.
    >
    >
    >
    > > тоже поможет FullRefresh..
    >
    > не помогает :(

    тогда сделай  FIBDataSet.CloseOpen(False)
  • Виталий Панасенко (01.04.09 10:54) [8]
    хотя странно.. FullRefresh делает тотже CloseOpen. только старается оставить активной текущую позицию в НД
  • PEAKTOP © (01.04.09 14:49) [9]
    > хотя странно.. FullRefresh делает тотже CloseOpen. только
    > старается оставить активной текущую позицию в НД


    Вполне закономерно, если у читающей транзакции не указано свойство Params, то будут параметры по-умолчанию:
    isc_tpb_concurrency
    isc_tpb_write
    isc_tpb_nowait

    А надо поставить
    isc_tpb_read_commited
    isc_tpb_read
    isc_tpb_rec_version или isc_tpb_no_rec_version (как надо автору)
    isc_tpb_nowait или isc_tpb_wait (как надо автору)
  • Anatoly Podgoretsky © (01.04.09 15:56) [10]
    > TheEd  (01.04.2009 10:04:03)  [3]

    Переделать архитектуру, что бы это было желательно или по крайней мере безразлично.
  • TheEd (01.04.09 17:56) [11]
    итак, сдела параметры транзакции:
     read_commited
     read
     no_rec_version
     wait

    далее в коде, после того как вставились записи:
     SomeReadTransaction.CommitRetaining;
     SomeDataSet.FullRefresh;

    и болт! :(((

    короче вышел из ситуации но криво:
    procedure TDM.FullReconnect;
    var
     i : integer;
    begin
     inherited;
     for i := 1 to dsContainer.DataSetCount - 1 do   // в контейнере - все датасеты
       with dsContainer.DataSet(i) do
         Tag := RecNo;

     fibDB.Close;  // это БД
     DoConnect;  // тут БД коннестится и датасеты все Оупенятся

     for i := 1 to dsContainer.DataSetCount - 1 do
       with dsContainer.DataSet(i) do
         RecNo := Tag; // восстанавливаем позиции
    end;

  • Медвежонок Пятачок © (01.04.09 19:09) [12]
    кривой изначальный дизайн приложения неизбежно приводит к кривым решениям
  • TheEd (01.04.09 19:17) [13]
    2 Медвежонок Пятачок:

    не спорю...
    но перепахивать дизайн страшно некогда, а дурная натура пытается дойти до сути
  • Виталий Панасенко (02.04.09 11:26) [14]
    Не знаю, что ты там химичил.. специально слепил БД из двух таблиц - все прекрасно отображается. могу пример на мыло выслать..:-)
    /******************************************************************************/
    /***          Generated by IBExpert 2009.01.16 02.04.2009 10:24:41          ***/
    /******************************************************************************/

    SET SQL DIALECT 3;

    SET NAMES WIN1251;

    CREATE DATABASE 'c:\fdb\tttt.fdb'
    USER 'SYSDBA' PASSWORD 'dbnfkbr'
    PAGE_SIZE 16384
    DEFAULT CHARACTER SET WIN1251;

    /******************************************************************************/
    /***                               Generators                               ***/
    /******************************************************************************/

    CREATE SEQUENCE GEN_T1_ID;
    CREATE SEQUENCE GEN_T2_ID;

    /******************************************************************************/
    /***                                 Tables                                 ***/
    /******************************************************************************/

    CREATE TABLE T1 (
       ID  BIGINT NOT NULL,
       D   DATE DEFAULT current_date
    );

    CREATE TABLE T2 (
       ID   BIGINT NOT NULL,
       IID  BIGINT NOT NULL,
       DT   TIMESTAMP DEFAULT current_timestamp
    );

    /******************************************************************************/
    /***                              Primary Keys                              ***/
    /******************************************************************************/

    ALTER TABLE T1 ADD CONSTRAINT PK_T1 PRIMARY KEY (ID);
    ALTER TABLE T2 ADD CONSTRAINT PK_T2 PRIMARY KEY (ID);

    /******************************************************************************/
    /***                                Triggers                                ***/
    /******************************************************************************/

    SET TERM ^ ;

    /******************************************************************************/
    /***                          Triggers for tables                           ***/
    /******************************************************************************/

    /* Trigger: T1_AI0 */
    CREATE OR ALTER TRIGGER T1_AI0 FOR T1
    ACTIVE AFTER INSERT POSITION 0
    AS
    declare variable I integer;
    begin
     /* Trigger text */
     I = 1;
     while (I<5) do
      begin
        insert into t2
        (iid) values (new.id);
        I = I+1;
      end
    end
    ^

    /* Trigger: T1_BI */
    CREATE OR ALTER TRIGGER T1_BI FOR T1
    ACTIVE BEFORE INSERT POSITION 0
    as
    begin
     if (new.id is null) then
       new.id = gen_id(gen_t1_id,1);
    end
    ^

    /* Trigger: T2_BI */
    CREATE OR ALTER TRIGGER T2_BI FOR T2
    ACTIVE BEFORE INSERT POSITION 0
    as
    begin
     if (new.id is null) then
       new.id = gen_id(gen_t2_id,1);
    end
    ^

    SET TERM ; ^

    /******************************************************************************/
    /***                               Privileges                               ***/
    /******************************************************************************/

    /* Privileges of users */
    GRANT SELECT ON RDB$FORMATS TO PUBLIC;
    GRANT SELECT ON RDB$PAGES TO PUBLIC;
    GRANT SELECT ON RDB$ROLES TO PUBLIC;

 
Конференция "Базы" » как вычитать isert'ы, произошедшие в триггере одной из таблиц [D7, FB2.1]
Есть новые Нет новых   [134477   +40][b:0][p:0.004]