Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

как вычитать isert ы, произошедшие в триггере одной из таблиц   Найти похожие ветки 

 
TheEd   (2009-04-01 09:15) [0]

Уважаемые мастера!
Есть таблица А, при добавлении в неё записи в тригере АбифоИнсерт в таблицу Б вставляется ряд записей, связанных с таблицей А.
так вот трабл: без DB.Close / DB.Open не вижу изменений :(

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

Как их увидеть не разрывая связь с базой?


 
Медвежонок Пятачок ©   (2009-04-01 09:46) [1]

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


 
Виталий Панасенко   (2009-04-01 09:50) [2]


> TheEd   (01.04.09 09:15)  

а откуда НД таблицы Б знает о том, что триггер что-то вставил? абсолютно ничего не знает.. если это мастер-деталь, то сделать FullRefresh для Б. Да, в принципе, даже если не мастер-деталь, тоже поможет FullRefresh.. но если данных много.. сам понимаешь...


 
TheEd   (2009-04-01 10:04) [3]


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

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

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


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

не помогает :(


 
Медвежонок Пятачок ©   (2009-04-01 10:07) [4]

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

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


 
Sergey13 ©   (2009-04-01 10:15) [5]

> [0] TheEd   (01.04.09 09:15)
> без DB.Close / DB.Open

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


 
TheEd   (2009-04-01 10:19) [6]


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

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


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

DB : TpFIBDataBase
и как нормально? :S


 
Виталий Панасенко   (2009-04-01 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)


 
Виталий Панасенко   (2009-04-01 10:54) [8]

хотя странно.. FullRefresh делает тотже CloseOpen. только старается оставить активной текущую позицию в НД


 
PEAKTOP ©   (2009-04-01 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 ©   (2009-04-01 15:56) [10]

> TheEd  (01.04.2009 10:04:03)  [3]

Переделать архитектуру, что бы это было желательно или по крайней мере безразлично.


 
TheEd   (2009-04-01 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;


 
Медвежонок Пятачок ©   (2009-04-01 19:09) [12]

кривой изначальный дизайн приложения неизбежно приводит к кривым решениям


 
TheEd   (2009-04-01 19:17) [13]

2 Медвежонок Пятачок:

не спорю...
но перепахивать дизайн страшно некогда, а дурная натура пытается дойти до сути


 
Виталий Панасенко   (2009-04-02 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;



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.053 c
15-1265744589
Pavia
2010-02-09 22:43
2010.08.27
Мифы о программистах.


2-1267336730
New-zzzz
2010-02-28 08:58
2010.08.27
Как разнести записи в отчёте в 2 столбца ListView?


2-1275097955
DROWSY
2010-05-29 05:52
2010.08.27
"Логический" тип данных Firebird 1.5 в компонентах.


3-1240484531
harisma
2009-04-23 15:02
2010.08.27
Результат выполнения команды RESTORE VERIFYONLY


15-1274560189
Юрий
2010-05-23 00:29
2010.08.27
С днем рождения ! 23 мая 2010 воскресенье