|
|
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#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, 14:33 |
|
||
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#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:25 |
|
||
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#18+
dorian grey, А правильнее сначала через PASSTHROUGH создать процедуру на том конце, а потом опять же через PASSTHROUGH вызвать ее выполнение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2009, 16:38 |
|
||
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#18+
antanddorian grey, Можно еще попробовать нужный SQL динамически формировать подставив в строку значение переменной и через EXECUTE IMMEDIATE выполнить. Так по идее тоже не получится, потому что для формирования строки с запросом мне также надо будет подставить аргумент и он также подставится в виде названия переменной. antandА правильнее сначала через PASSTHROUGH создать процедуру на том конце, а потом опять же через PASSTHROUGH вызвать ее выполнение. Можно функцию и в центральной базе создать, но как ей передавать аргументы из удаленной? Приходит в голову только создать таблицу, в которую в удаленной базе записывать аргументы, реплицировать эту таблицу, а в центральной базе периодически запускать цикл по этой таблице с выполнением функции. Может есть еще варианты? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2009, 17:28 |
|
||
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#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; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2009, 18:00 |
|
||
|
Выполнение функции в удаленной базе (через репликацию)
|
|||
|---|---|---|---|
|
#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. А если все целиком, то и правда все хорошо. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2009, 11:07 |
|
||
|
|

start [/forum/topic.php?fid=55&tid=2010882]: |
0ms |
get settings: |
11ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
29ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
2ms |
| others: | 11ms |
| total: | 136ms |

| 0 / 0 |

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