Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Выполнение функции в удаленной базе (через репликацию) / 6 сообщений из 6, страница 1 из 1
06.10.2009, 14:33
    #36235153
dorian grey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение функции в удаленной базе (через репликацию)
Добрый день.

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?
...
Рейтинг: 0 / 0
06.10.2009, 16:25
    #36235525
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение функции в удаленной базе (через репликацию)
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 выполнить.
...
Рейтинг: 0 / 0
06.10.2009, 16:38
    #36235572
antand
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение функции в удаленной базе (через репликацию)
dorian grey,

А правильнее сначала через PASSTHROUGH создать процедуру на том конце,
а потом опять же через PASSTHROUGH вызвать ее выполнение.
...
Рейтинг: 0 / 0
06.10.2009, 17:28
    #36235724
dorian grey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение функции в удаленной базе (через репликацию)
antanddorian grey,
Можно еще попробовать нужный SQL динамически формировать подставив в строку значение переменной и через EXECUTE IMMEDIATE выполнить.

Так по идее тоже не получится, потому что для формирования строки с запросом мне также надо будет подставить аргумент и он также подставится в виде названия переменной.


antandА правильнее сначала через PASSTHROUGH создать процедуру на том конце,
а потом опять же через PASSTHROUGH вызвать ее выполнение.

Можно функцию и в центральной базе создать, но как ей передавать аргументы из удаленной?

Приходит в голову только создать таблицу, в которую в удаленной базе записывать аргументы, реплицировать эту таблицу, а в центральной базе периодически запускать цикл по этой таблице с выполнением функции.

Может есть еще варианты?
...
Рейтинг: 0 / 0
06.10.2009, 18:00
    #36235825
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;
...
Рейтинг: 0 / 0
07.10.2009, 11:07
    #36236815
dorian grey
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнение функции в удаленной базе (через репликацию)
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.
А если все целиком, то и правда все хорошо.
Спасибо!
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Выполнение функции в удаленной базе (через репликацию) / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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