Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Массовое обновление процедур  [new]
madin
Member

Откуда:
Сообщений: 56
На сервере ms sql server 2000 существует две базы: base1 и base2.
В base2 есть процедуры, в тексте которых идет обращение к таблицам первой базы (например, base1.dbo.users).

Как поменять в базе base2 во всех процедурах обращение к базе c base1 на base3?
24 июн 09, 15:19    [7338300]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
ручками
или иметь исходники процедур,в которіх поменять в любом редакторе и перенакатить процедурі.
-------------------------------------
Jedem Das Seine
24 июн 09, 15:39    [7338469]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
madin
Как поменять в базе base2 во всех процедурах обращение к базе c base1 на base3?
Сделать скрипт процедур, поменять текст в редакторе, залить скрипт процедур
24 июн 09, 15:55    [7338639]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Supra93
Member

Откуда:
Сообщений: 8174
madin
На сервере ms sql server 2000 существует две базы: base1 и base2.
В base2 есть процедуры, в тексте которых идет обращение к таблицам первой базы (например, base1.dbo.users).

Как поменять в базе base2 во всех процедурах обращение к базе c base1 на base3?

update sysobjects ...
24 июн 09, 16:01    [7338687]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
belkinn
Member

Откуда: Msk
Сообщений: 11
Supra93

update sysobjects ...


чтото вроде этого должно получится. конечно, лучше иметь список процедур подлежащих апдейту.
UPDATE s
	SET s2.text=REPLACE(s2, 'base1', 'base3')
FROM sysobjects s
	JOIN syscomments s2 ON s2.id = s.id
WHERE s.xtype='P'
24 июн 09, 16:26    [7338946]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33338
Блог
ЛУчше все же через редактор, и не 'base1' на 'base3', а ' base1.' на ' base3.'
24 июн 09, 16:30    [7338976]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36799
Лучше не апдейтить системные объекты.
24 июн 09, 16:31    [7338988]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
belkinn
Supra93

update sysobjects ...


чтото вроде этого должно получится. конечно, лучше иметь список процедур подлежащих апдейту.
UPDATE s
	SET s2.text=REPLACE(s2, 'base1', 'base3')
FROM sysobjects s
	JOIN syscomments s2 ON s2.id = s.id
WHERE s.xtype='P'
Отлично, учитывая, что в поле text хранится не весь текст процедуры, а его фрагменты :-)

т.е. будет в одной записи "... from ba", а в другой продолжение - "se1 where ..."

К тому же сделать через редактор займёт 3 минуты.
24 июн 09, 16:49    [7339151]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
belkinn
Member

Откуда: Msk
Сообщений: 11
alexeyvg
belkinn
Supra93

update sysobjects ...


чтото вроде этого должно получится. конечно, лучше иметь список процедур подлежащих апдейту.
UPDATE s
	SET s2.text=REPLACE(s2, 'base1', 'base3')
FROM sysobjects s
	JOIN syscomments s2 ON s2.id = s.id
WHERE s.xtype='P'
Отлично, учитывая, что в поле text хранится не весь текст процедуры, а его фрагменты :-)

т.е. будет в одной записи "... from ba", а в другой продолжение - "se1 where ..."

К тому же сделать через редактор займёт 3 минуты.


конечно, руками работа качественнее, но если больше сотни процедур... :)
тем не менее, скриптом тоже вариант, весь текст процедур кусками(поле colid - номер фрагмента) там есть. потом можно дополнительно отследить разорванные 'base'.
24 июн 09, 17:27    [7339491]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
belkinn
конечно, руками работа качественнее, но если больше сотни процедур... :)
Да не руками - в MS Word Ctrl+H :-)
24 июн 09, 17:40    [7339586]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Winnipuh
Member [заблокирован]

Откуда: Київ
Сообщений: 10428
belkinn
alexeyvg
belkinn
Supra93

update sysobjects ...


чтото вроде этого должно получится. конечно, лучше иметь список процедур подлежащих апдейту.
UPDATE s
	SET s2.text=REPLACE(s2, 'base1', 'base3')
FROM sysobjects s
	JOIN syscomments s2 ON s2.id = s.id
WHERE s.xtype='P'
Отлично, учитывая, что в поле text хранится не весь текст процедуры, а его фрагменты :-)

т.е. будет в одной записи "... from ba", а в другой продолжение - "se1 where ..."

К тому же сделать через редактор займёт 3 минуты.


конечно, руками работа качественнее, но если больше сотни процедур... :)
тем не менее, скриптом тоже вариант, весь текст процедур кусками(поле colid - номер фрагмента) там есть. потом можно дополнительно отследить разорванные 'base'.


а что будет к примеру с вью или таблицами с именами типа v_base1myview, mybase1 и т.д. ?
Я бы не стал советовать такие вещи...
24 июн 09, 18:19    [7339852]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Нипонил....Вы храните исходный код ХП только в самой базе ?....Жесть !!!!!
А как-же скрипты ?....У вас нет скриптов ?
24 июн 09, 18:44    [7339961]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
belkinn
Member

Откуда: Msk
Сообщений: 11

а что будет к примеру с вью или таблицами с именами типа v_base1myview, mybase1 и т.д. ?
Я бы не стал советовать такие вещи...

нет, я в принципе согласен, что лучше не лезть в системные таблицы. маловероятно, что такой реплейс пройдет полностью успешно, для этого надо было и соблюдать согласованную стилистику написания. кроме того, если старые именования БД могут использоваться не только в ХР, но и во вьюхах или триггерах. к тому же могут быть зашифрованы.

LSV
Нипонил....Вы храните исходный код ХП только в самой базе ?....Жесть !!!!!
А как-же скрипты ?....У вас нет скриптов ?

лучше действительно иметь репазиторий, в котором хранить все необходимые приложения, скрипты и прочие инструменты, удобная командная работа, поддержка версий.
оттуда уже доставать скрипты drop procedure - create procedure в нужных модификациях и с необходимыми изменениями.
24 июн 09, 18:56    [7340025]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
regular expressions ещё никто не отменял.
Script out все процедуры. Поменять base1 на base2. Только целые слова. Например используя sed. накатить на базу. Самое быстрое получится. И, пожалуй, надёжнее всего.
24 июн 09, 20:35    [7340269]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
GlebZ
regular expressions ещё никто не отменял.
Script out все процедуры. Поменять base1 на base2. Только целые слова. Например используя sed. накатить на базу. Самое быстрое получится. И, пожалуй, надёжнее всего.
Конечно, быстрее и надёжнее - это и предлагаю.
25 июн 09, 08:18    [7340897]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
madin
Member

Откуда:
Сообщений: 56
Всем спасибо за активное обсуждение!
Ваши советы очень сильно помогли.

Решение выглядит так:
1. через аналайзер запускаю скрипт, результат загоняю в текстовый файл
select
case 
 when colid=1 then REPLACE(REPLACE(text,'base1.','base3.'),'CREATE PROCEDURE','GO'+CHAR(13)+CHAR(10)+'ALTER PROCEDURE')
 else REPLACE(text,'base1.','base3.')
end
from sysobjects
 inner join syscomments on sysobjects.id=syscomments.id
where sysobjects.type='P' and sysobjects.userstat=0 and
 sysobjects.category =0 
order by name

Комментарий: поле colid позволяет отпределить процедура хранится в одной записи или в нескольких.

2. Открываю текстовый файл и правлю текст там где между CREATE и PROCEDURE стоит несколько пробелов, например, CREATE___PROCEDURE (не знаю как это сделать с помощью запроса на шаге 1)

3. запускаю файл в аналайзере

PS:
1.Поле text не удается править, даже после того как разрешил правку системных таблиц. Стал писать что поле вычисляемое.

2. Процедуры конечно храню еще в отдельном файле, но есть подозрения что там не актуальная информация :-)
25 июн 09, 09:25    [7341021]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33338
Блог
madin

2. Открываю текстовый файл и правлю текст там где между CREATE и PROCEDURE стоит несколько пробелов, например, CREATE___PROCEDURE (не знаю как это сделать с помощью запроса на шаге 1

Хе, раз уж вы все равно правите текстовой файл, то лучшее решение выглядело бы так
1) заскриптовали все процедуры-функции в текстовой файл
2) ctrl+h в любом текстовом редакторе
3) накатили скрипт
25 июн 09, 09:44    [7341070]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31161
madin
Решение выглядит так:
1. через аналайзер запускаю скрипт, результат загоняю в текстовый файл
Да чтож вы так сложности любите!!!

Не проще ли было скрипт нажатием правой кнопки мышки сделать :-)

И вероятность ошибки - 0
25 июн 09, 09:51    [7341102]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
мда :)) Вам уже раз 5 сказали как сделать менее болезнено для себя,заодно и исходники обновилиб ,а вам секас подавай ))
-------------------------------------
Jedem Das Seine
25 июн 09, 10:06    [7341180]     Ответить | Цитировать Сообщить модератору
 Re: Массовое обновление процедур  [new]
belkinn
Member

Откуда: Msk
Сообщений: 11
madin

1.Поле text не удается править, даже после того как разрешил правку системных таблиц. Стал писать что поле вычисляемое.


действительно, вычисляемое!
[sql](convert(nvarchar(4000),case when ([status] & 2 = 2) then (uncompress([ctext])) else [ctext] end))
[/sql]
все хранится в поле ctext в бинарном виде.
извини за бесполезный совет :)

для выгрузки процедур в текстовый файл помимо SSMS могу посоветовать инструмент Embarcadero DB Artisan: можно разом выделить все процедуры и одной кнопкой слить в один txt файл. В наличии также множество очень полезных других функций.
25 июн 09, 11:01    [7341516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить