Главная страница
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.077 c
15-1266434679
NewZ
2010-02-17 22:24
2010.08.27
Язык ОС.


2-1268626597
NBAH1990
2010-03-15 07:16
2010.08.27
Как сделать исчезающую панель?


2-1270109240
Цукор5
2010-04-01 12:07
2010.08.27
Картинка на форме


11-1221153345
Ayaha
2008-09-11 21:15
2010.08.27
Где найти kol_unicode.inc?


15-1265037576
TStas
2010-02-01 18:19
2010.08.27
Что за файлы с расширением GID?