Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
create procedure test_tt (@id int)
as 
select @id


select text from sys.syscomments
where text like '%test_tt%'
order by text


update sys.syscomments
set text =text +'+3'
where text like '%test_tt%'

Msg 259, Level 16, State 1, Line 2
Ad hoc updates to system catalogs are not allowed.

Вопрос: можно ли внести изменения в код процедур, сразу в несколько хп?
20 апр 12, 17:38    [12447641]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
trew
Вопрос: можно ли внести изменения в код процедур, сразу в несколько хп?
Можно. Выполнив несколько команд alter procedure.
20 апр 12, 17:41    [12447659]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
trew
Вопрос: можно ли внести изменения в код процедур, сразу в несколько хп?
Самый правильный способ - организовать правильно разработку, делая изменений в проекте, а потом деплоить изменения на сервер.

А на сервере сделать изменения не так просто: в общем случае нужно писать какой то свой синтаксический анализатор, находить в тексте create procedure, менять его на alter procedure и выполнять.
20 апр 12, 17:52    [12447753]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Кстати синтаксический анализатор лучше организовать или во внешнем приложении или на крайний случай с использованием подключаемой внешней sp. Я к тому, что на голом SQL без регулярных выражений сложновато/неудобно c текстом работать.
20 апр 12, 17:57    [12447802]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
declare @tt varchar(max)

select top 1 @tt= replace(text,'create procedure','') from sys.syscomments
where text like '%test_tt%'
order by text

exec('alter procedure ' + @tt + '+ 3')

Эту идею можно развить, заменив переменную табличной переменной с циклом.

Всем спасибо, за идеи и помощь.
20 апр 12, 18:01    [12447837]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
trew,

Не так просто надежно получить alter procedure, как кажется:
use tempdb;
go

/*Create test procedure*/
create procedure dbo.spTest
as
begin
 return 0;
end;
go

select object_definition(object_id('dbo.spTest', 'P'));
go

drop procedure dbo.spTest;
go
20 апр 12, 18:19    [12447904]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
zhhh
Guest
replace(text,'create procedure','') обломается на "create proc my_proc", "create procedure", ...
20 апр 12, 18:34    [12447952]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
zhhh
Guest
ловко вырезались пробелы в предыдущем посте...
там между "create" и "procedure" была кучка пробелов,
которые так и попадают кучей в syscomments
20 апр 12, 18:37    [12447962]     Ответить | Цитировать Сообщить модератору
 Re: Изменить объект базы данных, например процедуру, внешним кодом (ms sql2008r2)  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31958
trew
declare @tt varchar(max)

select top 1 @tt= replace(text,'create procedure','') from sys.syscomments
where text like '%test_tt%'
order by text

exec('alter procedure ' + @tt + '+ 3')


Эту идею можно развить, заменив переменную табличной переменной с циклом.

Всем спасибо, за идеи и помощь.
Не получится так, написал же, что нужен анализатор и в sys.syscomments хранятся фрагменты процедур.

Вы просто таким запросом удалите хранимые процедуры, а бакапов базы у вас понятно нету.
20 апр 12, 18:40    [12447971]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить