
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
06.10.2009, 14:33
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
Добрый день. ASA902 В целом задача следующая: Из центральной базы строка таблицы remote_table передается в удаленную базу. Строка передается по условию. Требуется удалить строку в удаленной базе, оставив ее в центральной. Мы находимся в удаленной базе и имеем доступ к центральной только через репликацию. Едиственный способ - это изменить условие переноса, чтобы оно не выполнялось. Условие, соответственно, надо менять в центральной базе. Для этого создал функцию в удаленной базе: авторALTER FUNCTION "DBA"."update_remote_table"(in ai_id integer) returns integer begin PASSTHROUGH ONLY FOR repluser0; update remote_table set remote_table.code=1 where remote_table.id=ai_id;commit PASSTHROUGH STOP; return(0) end Запускаю функцию в удаленной базе select update_remote_table(1000); При репликации выдается ошибка E. 10/06 14:16:38. SQL statement failed: (-143) Column 'ai_id' not found E. 10/06 14:16:38. Skipping: E. 10/06 14:16:38. update remote_table set remote_table.code=1 where remote_table.id=ai_id; То есть аргумент функции не подставляется в update. Как его впихнуть в PASSTHROUGH? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.10.2009, 16:25
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
dorian grey, PASSTHROUGH ONLY FOR repluser0; update remote_table set remote_table.code=1 where remote_table.id=1000;commit PASSTHROUGH STOP Т.е. все что находится в PASSTHROUGH передается как есть без всяких подстановок переменных. Можно еще попробовать нужный SQL динамически формировать подставив в строку значение переменной и через EXECUTE IMMEDIATE выполнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.10.2009, 16:38
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
dorian grey, А правильнее сначала через PASSTHROUGH создать процедуру на том конце, а потом опять же через PASSTHROUGH вызвать ее выполнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.10.2009, 17:28
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
antanddorian grey, Можно еще попробовать нужный SQL динамически формировать подставив в строку значение переменной и через EXECUTE IMMEDIATE выполнить. Так по идее тоже не получится, потому что для формирования строки с запросом мне также надо будет подставить аргумент и он также подставится в виде названия переменной. antandА правильнее сначала через PASSTHROUGH создать процедуру на том конце, а потом опять же через PASSTHROUGH вызвать ее выполнение. Можно функцию и в центральной базе создать, но как ей передавать аргументы из удаленной? Приходит в голову только создать таблицу, в которую в удаленной базе записывать аргументы, реплицировать эту таблицу, а в центральной базе периодически запускать цикл по этой таблице с выполнением функции. Может есть еще варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
06.10.2009, 18:00
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
Получится т.к. Вы строку будете формировать вне PASSTHROUGH. примерно так select sql='PASSTHROUGH ONLY FOR repluser0; update remote_table set remote_table.code=1 where remote_table.id='+convert(varchar(20),ai_id) +';commit PASSTHROUGH STOP; ' EXECUTE IMMEDIATE sql А если через процедуру в центральной базе то и вызывать ее PASSTHROUGH ONLY FOR repluser0; call proc(1000) PASSTHROUGH STOP; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
07.10.2009, 11:07
|
|||
|---|---|---|---|
|
|||
Выполнение функции в удаленной базе (через репликацию) |
|||
|
#18+
antandПолучится т.к. Вы строку будете формировать вне PASSTHROUGH. примерно так select sql='PASSTHROUGH ONLY FOR repluser0; update remote_table set remote_table.code=1 where remote_table.id='+convert(varchar(20),ai_id) +';commit PASSTHROUGH STOP; ' EXECUTE IMMEDIATE sql А если через процедуру в центральной базе то и вызывать ее PASSTHROUGH ONLY FOR repluser0; call proc(1000) PASSTHROUGH STOP; Понял, действительно получится. Сначала подумал, что вы предлагаете формировать внутри PASSTHROUGH. А если все целиком, то и правда все хорошо. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=55&mobile=1&tid=2010882]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
57ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 238ms |
| total: | 385ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...