Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Процедура со свойствами системной / 11 сообщений из 11, страница 1 из 1
30.03.2009, 11:28
    #35899911
big-n-green
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
Здравствуйте.

Существует идея и, к сожалению, моих знаний для точного ответа: возможно или нет - не хватает. Немогли бы Вы посоветовать.

Ситуация:
Существует множество баз одинаковых по смыслу и разбитых по принадлежности к региону, например. Интересующие таблицы называются во всех базах одинаково и несут одинаковую смысловую нагрузку.
На данный момент существует во всех базах одинаковые процедуры, которые необходимо одновременно менять при "изменении политики партии".

Идея:
Отказаться от кучи одинаковых процедур и сделать всего одну с изменяемыми параметрами.

Заковырка:
Создать отдельную базу и процедуры перенести туда не проблема. Проблема где будет выполняться данная процедура( точнее где будет её лог )? Девайсы логов и кешей отданы полностью под те одинаковые базы и распределены в зависимости от значимости. Есть идея создать а-ля системную процедуру, которую можно вызвать из любой базы, но её код хранится в единичном экземпляре. Минусы: захламление sybsystemprocs и использование exec, что затрудняет восприятие кода( либо делать пустышки, что еще хуже )

Вопрос:
Можно ли реализовать идею, не захломляя sybsystemprocs?
...
Рейтинг: 0 / 0
30.03.2009, 11:39
    #35899956
big-n-green
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
Пордон, используется ASE 12.5
...
Рейтинг: 0 / 0
30.03.2009, 12:30
    #35900106
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
big-n-green пишет:

> Заковырка:
> Создать отдельную базу и процедуры перенести туда не проблема. Проблема
> где будет выполняться данная процедура( точнее где будет её лог )?

А это не зависит от того, где лежит процедура. Это зависит от того, где
лежат таблицы, которые она меняет.

> системную процедуру, которую можно вызвать из любой базы, но её код
> хранится в единичном экземпляре.

На самом деле "системная процедура" очень проста.
Все процедуры, название которых начинается с "sp_", ищутся
не только в текущей БД, но и в sybsystemprocs.
Вот только не помню, где сначала, и только ли в sybsystemprocs.
(можно прочитать в документации).
Более ничем "системная процедура" не примечательна/особенна.

Минусы: захламление sybsystemprocs и

А что в этом плохого ? Ничего.

> использование exec, что затрудняет восприятие кода( либо делать
> пустышки, что еще хуже )

Это вот я не понял.

> Вопрос:
> Можно ли реализовать идею, не захломляя sybsystemprocs?

Наверное, нет.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
30.03.2009, 12:39
    #35900141
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
big-n-green,

не вижу проблем в обновлении процедур в нескольких БД "почти" одновременно

можно не захламлять sybsystemprocs
а захламить, например, master ;)

или создайте БД common, откуда и дергайте вашу общую процу
...
Рейтинг: 0 / 0
30.03.2009, 13:16
    #35900281
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
komrad пишет:

> или создайте БД common, откуда и дергайте вашу общую процу

Только для вызова процедуры из бд common придётся явно задавать
имя процедуры с полным путём, с префиксом , напр:

exec common..my_cool_proc
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
30.03.2009, 13:34
    #35900330
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
MasterZiv,

так оно и есть

как вариант:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use db1
go
create proc ordinary_proc; 1 
(@param1 ...
@param2 ...
@param3...)
as
begin
   declare @db varchar( 50 )
   select @db=db_name()   /*передадим контекст выполнения*/
   exec common..cool_proc @db, @param1,@param2, @param3...
end 
go
...
Рейтинг: 0 / 0
30.03.2009, 15:17
    #35900671
big-n-green
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
Спасибо за советы.

MasterZiv:
>А это не зависит от того, где лежит процедура. Это зависит от того, где
>лежат таблицы, которые она меняет.

Т.е. если процедура лежит у меня в db1, а искомые таблицы в db2..dbN То будут использоваться только их логи db2..dbN и db1 не будет затронута?

>А что в этом плохого ? Ничего.
Понятно, спасибо.

>> использование exec, что затрудняет восприятие кода( либо делать
>> пустышки, что еще хуже )
>Это вот я не понял.

Немного наверно криво сказал, попробую привести пример:

Возьмем абстрактную процедуру:
create proc sp_proc1
as
BEGIN
select * into tmp_table from table1 where ....

update tmp_table
....

insert into table2
from tmp_table
END

Её можно будет собрать в базе sybsystemprocs только в случае присутствия таблиц: table1, tmp_table, table2

либо создать процедуру так:
create proc sp_proc1
as
BEGIN
exec( '
select * into tmp_table from table1 where ....

update tmp_table
....

insert into table2
from tmp_table
' )
END

Если будет тем или иным способом создана процедура, то при вызовах:
exec db1..sp_proc1
exec db2..sp_proc1
exec db3..sp_proc1

Будут использоваться таблицы соответствующих баз.

komrad:
Да, такой способ будет работать, но Ваша cool_proc будет динамической через exec?
Вообщем-то примерно так пока и работает просто если код процедуры очень большой, то анализ такой процедуры со всеми вставками получается неимоверным.

Еще раз спасибо за советы, будем пробовать.
...
Рейтинг: 0 / 0
30.03.2009, 15:21
    #35900686
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
big-n-green
komrad:
Да, такой способ будет работать, но Ваша cool_proc будет динамической через exec?


а
Код: plaintext
exec sp_who

тоже динамическая? ;)
...
Рейтинг: 0 / 0
30.03.2009, 15:42
    #35900759
big-n-green
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
komradbig-n-green
komrad:
Да, такой способ будет работать, но Ваша cool_proc будет динамической через exec?


а
Код: plaintext
exec sp_who

тоже динамическая? ;)

Видимо теперь я не понял. Давайте возьмем пример. На данный момент есть в каждой базе процедура:
Код: plaintext
1.
2.
3.
4.
5.
create proc proc1
as
begin
    insert into table1 values( 'test' )
end

Если сделать как Вы предлагаете, то возможен только такой вариант:
В каждой базе создается процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
create proc link_proc1
as
begin
   declare @db varchar( 50 )
   select @db=db_name()
   exec common..proc1 @db
end

в базе common создается процедура:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
create proc proc1 @dbname varchar( 10 )
as
begin
    declare @s varchar( 1 )
    select @s = substring('''',  1 , 1  )

    exec( 'insert into ' + @dbname + '..table1 vales( ' + @s+ 'test' + @s + ') ')
end

Я не совсем понял как код sp_who, где используется таблицы базы master может помочь.
Можете пояснить?
...
Рейтинг: 0 / 0
30.03.2009, 15:48
    #35900781
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
big-n-green

Я не совсем понял как код sp_who, где используется таблицы базы master может помочь.
Можете пояснить?

это был вопрос-шутка
не стоит путать exec proc и exec ('....') - это разные вещи
второе - динамический sql
первое - способ запуска процедур
...
Рейтинг: 0 / 0
30.03.2009, 15:52
    #35900790
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Процедура со свойствами системной
big-n-green пишет:

>
> Т.е. если процедура лежит у меня в db1, а искомые таблицы в db2..dbN То
> будут использоваться только их логи db2..dbN и db1 не будет затронута?

Что значит "затронута" ?

> Её можно будет собрать в базе sybsystemprocs только в случае присутствия
> таблиц: table1, tmp_table, table2

Так нет, вы должны будете указывать полные имена этих таблиц, из другой
БД. НО ОДНОЙ ! Вот я и не понимаю, как вы это собираетесь делать.
Т.е. как одна процедура будет работать то с одной БД, то с другой.

Я бы в таком случае просто плюнул, и написал приблуду, которая одну и
ту же процедуру по N базам распихивает. Будет проще.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Процедура со свойствами системной / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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