powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute block и set_context
15 сообщений из 15, страница 1 из 1
execute block и set_context
    #38691970
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть БД, в которой триггеры следят за пользовательскими переменными и в зависимости от значения либо выполняют операцию изменения данных, либо сваливается в exeption
возникла необходимость массовой обработки данных и был написан следующий execute block
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select rdb$set_context('USER_SESSION','RPL_MANAGER','1') from rdb$database;
execute block
as
declare variable OLD_ID ID_;
declare variable NEW_ID ID_;
begin
for select p.id_podrazdelenie
from podrazdelenie p
where p.is_rkp = 1
  and char_length(p.id_podrazdelenie) < 9
into :old_id
do
  begin
  new_id = old_id * 1000000 + 191;
  insert into PODRAZDELENIE (ID_PODRAZDELENIE,ID_PARENT,ID_REGION,DIRECTOR_ID,IS_RKP,PODRAZDNAME,PODRAZDNAME_SOKR,SNAME,RPL_ID_SERVER,ID_CLIENT,IS_MOBILE,ID_SP_RK_SUBSYSTEM,ID_RK_PLACE,BARCHIV,ID_CLIENT_DBS,ID_CLIENT_EIS)
  select :new_id,"ID_PARENT","ID_REGION","DIRECTOR_ID","IS_RKP","PODRAZDNAME","PODRAZDNAME_SOKR","SNAME","RPL_ID_SERVER","ID_CLIENT","IS_MOBILE","ID_SP_RK_SUBSYSTEM","ID_RK_PLACE","BARCHIV","ID_CLIENT_DBS","ID_CLIENT_EIS"
  from PODRAZDELENIE
  where ID_PODRAZDELENIE = :old_id;
  update 'нескольких таблиц';
  delete from 'откуда-то';
end
end;


но собственно на insert и сваливается в exeption, хотя значение переменной установлено правильно.
никто не подскажет в чём косяк?
...
Рейтинг: 0 / 0
execute block и set_context
    #38691971
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FB 2.5
...
Рейтинг: 0 / 0
execute block и set_context
    #38692015
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не уловил, при чем тут execute block и set context. Да еще и двойные кавычки зачем-то в именах столбцов понатыканы.

roadsterсобственно на insert и сваливается в exeption
какой exception???
...
Рейтинг: 0 / 0
execute block и set_context
    #38692026
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

это установленное значение где-то проверяется?
...
Рейтинг: 0 / 0
execute block и set_context
    #38692027
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadster,

Код: sql
1.
2.
3.
4.
5.
6.
7.
declare variable OLD_ID ID_;
declare variable NEW_ID ID_;
. . .
select p.id_podrazdelenie from . . .
where сhar_length(p.id_podrazdelenie) < 9
. . .
new_id = old_id * 1000000 + 191;

DDL домена "_ID" и таблицы "podrazdelenie" можно глянуть ?
И зачем там char_length, кстати ?
...
Рейтинг: 0 / 0
execute block и set_context
    #38692066
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvне уловил, при чем тут execute block и set context.может быть неправильно сформулирован вопрос в теме, спорить не буду.
kdvДа еще и двойные кавычки зачем-то в именах столбцов понатыканы.это мне прислали, я добавил только for select чтобы руками не забивать переменную OLD_ID, а пробежаться по циклу, там записей порядка 30 штук, выполнить надо на 15 БД, боюсь сломать мышку...
kdvкакой exception???ну вот такой
Код: sql
1.
CREATE EXCEPTION E_STUB_REF 'туда-сюда, главное словить и напугать юзера';


текст я заменил, эксепшен ни о чём, отлавливается в триггере по пользовательской переменной
pastorэто установленное значение где-то проверяется?в триггере
ТаблоидDDL домена "_ID" и таблицы "podrazdelenie" можно глянуть ?конечно, но там всё тривиально
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE DOMAIN ID_ AS
NUMERIC(18,0);

CREATE TABLE PODRAZDELENIE (
    ID_PODRAZDELENIE    ID_ NOT NULL /* ID_ = NUMERIC(18,0) */,
    ID_PARENT           ID_ /* ID_ = NUMERIC(18,0) */,
    ID_REGION           ID_ /* ID_ = NUMERIC(18,0) */,
    DIRECTOR_ID         ID_ /* ID_ = NUMERIC(18,0) */,
    IS_RKP              INTEGER,
    PODRAZDNAME         VARCHAR(128),
    PODRAZDNAME_SOKR    VARCHAR(64),
    SNAME               VARCHAR(16),
    ID_CLIENT           ID_ /* ID_ = NUMERIC(18,0) */,
    IS_MOBILE           BOOL DEFAULT 0 /* BOOL = NUMERIC(1,0) */,
    ID_SP_RK_SUBSYSTEM  ID_ /* ID_ = NUMERIC(18,0) */,
    ID_RK_PLACE         ID_ /* ID_ = NUMERIC(18,0) */,
    RPL_ID_SERVER       INT_DOM NOT NULL /* INT_DOM = INTEGER */,
    BARCHIV             BOOL DEFAULT 0 /* BOOL = NUMERIC(1,0) */,
    ID_CLIENT_DBS       ID_ /* ID_ = NUMERIC(18,0) */,
    ID_CLIENT_EIS       ID_ /* ID_ = NUMERIC(18,0) */
);


ТаблоидИ зачем там char_length, кстати ?
есть ID с признаком IS_RKP = 1 у которых просто 4-х значный номер, им необходимо добавить постфикс (в конец в общем) 000191. есть ID с признаком IS_RKP = 1 у которых постфикс уже добавлен. собственно запрос отрабатывает правильно, я проверял, да и работа разовая.
...
Рейтинг: 0 / 0
execute block и set_context
    #38692074
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если важно, то есть БД в которых сваливается в эксепшен не на инсёрте, а на следующем апдейте.
такое поведение нормальное - это реализация механизма блокирования таблиц на изменение данных в зависимости от места в репликационной цепочке.
...
Рейтинг: 0 / 0
execute block и set_context
    #38692124
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
э-хе-хе...
ну вот триггер ещё до кучи
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE OR ALTER TRIGGER RPL_STB_PODRAZDELENIE FOR PODRAZDELENIE
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 2000
AS
DECLARE VARIABLE RELATION_NAME D_OBJECT_NAME;
BEGIN
    RELATION_NAME = 'PODRAZDELENIE';
    IF (NOT EXISTS(
        SELECT TR.ID_RPL_TRIGGER
        FROM RPL_TRIGGERS TR
            JOIN RPL_TABLES T ON T.ID_RPL_TABLE = TR.ID_RPL_TABLE
        WHERE T.TABLE_NAME = :RELATION_NAME AND TR.ST_FLAG = 1)) THEN EXIT;
    IF (RDB$GET_CONTEXT('USER_SESSION','RPL_SERVICE') IS DISTINCT FROM 1) THEN
        EXCEPTION E_STUB_REF;
END

хотя смысла это не меняет...
...
Рейтинг: 0 / 0
execute block и set_context
    #38692152
Dzirt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterэ-хе-хе...
ну вот триггер ещё до кучи
Код: sql
1.
2.
3.
4.
5.
6.
CREATE OR ALTER TRIGGER RPL_STB_PODRAZDELENIE FOR PODRAZDELENIE
ACTIVE BEFORE INSERT OR UPDATE OR DELETE POSITION 2000
AS
...
    IF (RDB$GET_CONTEXT('USER_SESSION','RPL_SERVICE') IS DISTINCT FROM 1) THEN
        EXCEPTION E_STUB_REF;

хотя смысла это не меняет...
Почему здесь не вот так?
Код: sql
1.
2.
...
    IF (RDB$GET_CONTEXT('USER_SESSION','RPL_SERVICE') IS DISTINCT FROM '1') THEN
...
Рейтинг: 0 / 0
execute block и set_context
    #38692155
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtПочему здесь не вот так?"здесь" - это в блоке?
хм...
сейчас попробую.
...
Рейтинг: 0 / 0
execute block и set_context
    #38692169
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dzirt,

не работает.
хотя если просто ничего не делать и возвращать значение переменной, то она равна 1.
...
Рейтинг: 0 / 0
execute block и set_context
    #38692172
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DzirtПочему здесь не вот так?
Да абсолютно пофиг.

roadster
Код: sql
1.
select rdb$set_context('USER_SESSION','RPL_MANAGER','1')...


roadster
Код: sql
1.
IF (RDB$GET_CONTEXT('USER_SESSION','RPL_SERVICE')...


Разницу сам заметишь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
execute block и set_context
    #38692180
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

спасибо большое.
...
Рейтинг: 0 / 0
execute block и set_context
    #38692241
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
roadsterну вот триггер ещё до кучи
автор DDL не ты, как я понимаю. А создателям триггеров не пришло в голову создать юзера REPLUSER, и проверять уже все для него?
По-моему что-то неладно в этом королевстве. Триггер проверяет наличие триггеров на таблице?
...
Рейтинг: 0 / 0
execute block и set_context
    #38692450
Фотография roadster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvавтор DDL не ты, как я понимаю.абсолютно верно
kdvА создателям триггеров не пришло в голову создать юзера REPLUSER, и проверять уже все для него?юзер есть, но не для этого :)
kdvТриггер проверяет наличие триггеров на таблице?исторические остатки. первоначально логика репликации строилась полностью на триггерах и в зависимости от направления реплики триггер был включен или выключен (я не застал времена, когда в принципе направление определялось наличием или отсутствием триггера, но говорят такое было). теперь иная схема, есть таблицы маршрутизации с флагами направлений реплики.
ЗЫ неладностей много, но самая большая в том, что мне уже много месяцев обещают прислать описание механизма реплики, но никак что-то не пришлют.
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / execute block и set_context
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]