Форум: "Базы";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
Внизкак вычитать 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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.068 c