Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Ребят есть такая задача, из всех процедур по ведомой базе (примерно 190-200) переименовать те которые не используются. Я написал процедуру которая дергает с помощью такой вот вюхи sys.dm_exec_procedure_stats системный кеш запускаемых процедур. Далее джоб запускает процедуру эту раз в 2 часа и складирует в табличку имена и еще некоторые параметры. Получиться за какое-то время я отобрал имена тех которые запускаются.

Теперь стоит следующее задание, те которые отсутствуют в моей табличке переименовать добавив префикс имени UNUSED_"имя процедуры"
Подскажите как бы это сделать правильно? Я совсем совсем начинающий и msdn мне мало чем помог(
Есть табличка с именами запускаемых процедур и база в которой порядка 190 процедур но из этих 190 реально ток половина где-то рабочая вторая черти что.
Заранее буду благодарен любой помощи и подсказкам.
21 фев 14, 20:09    [15607679]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
DeColo®es
Member

Откуда: Москва
Сообщений: 5503
Блог
sp_rename
21 фев 14, 21:38    [15608215]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
invm
Member

Откуда: Москва
Сообщений: 9724
Во избежание в дальнейшем неприятных сюрпризов, лучше не переименовывать, а создать специально отведенную для этих целей схему и переносить в нее.
21 фев 14, 21:53    [15608313]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Оно то так но когда тебе достается это в наследство от предшественников трудно что-то говорить) за подсказку sp_rename спасибо но я не совсем понимаю как ней воспользоваться. Можно пример под мой случай?
21 фев 14, 22:51    [15608668]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sarbai
Можно пример под мой случай?

для каждой процедуры выполняете эту процедуру
http://technet.microsoft.com/en-us/library/ms188351.aspx
21 фев 14, 23:18    [15608824]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm
Во избежание в дальнейшем неприятных сюрпризов, лучше не переименовывать, а создать специально отведенную для этих целей схему и переносить в нее.
+1

CREATE SCHEMA [Temp] AUTHORIZATION dbo
GO
ALTER SCHEMA [Temp] TRANSFER [dbo].[spMyProc1];
ALTER SCHEMA [Temp] TRANSFER [dbo].[spMyProc2];
-- ...


При обоих подходах тело процедуры не меняется (хранит старое название), и можно нарваться на побочные эффекты в очень специфических и редких моментах.
22 фев 14, 05:57    [15609858]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Ребят вот в этом как раз все грабли. Многие процедуры вызываются клиентом, а посему переименовать хотелось в таком режиме что как бы если что не так вернуть потом в зад то что ругается. Я почитал про процедуру sp_rename везде пишут что нею переименовывать процедуры крайне не рекомендуют ибо она меняет даже то что с констрейнами. Мне бы чет такого рода деревяненького вроде ALTER PROCEDURE + сравнение с моей табличкой мол что есть в табличке моей оставить таким же, а чего нет переименовать. Коллеги я весьма признателен всем советам и подсказкам просто не хочется рубать с плеча а потом потратить столько же времени на восстановление. Дело еще утяжеляет тот факт что данная база есть боевой и если я ее сломаю будет много крику) Да я могу по сути сделать копию да на ней по тренироваться отсекать хвосты, но я не смогу и проверить на работоспособность самой системы после ибо я не работаю с тем приложением и смоделировать условия когда вызовется та или иная обрубленная процедура не смогу, вот и получается нада все сделать на боевой но так чтоб в случае колапса быстро вернуть все назад. И желательно чтоб это было не развернуть бекап, ибо потеря данных так же не приемлема.

З.Ы. Прошу зарание прощения если много требований и условий но увы я весьма глубоко хочу подходить к таким задачам.
22 фев 14, 13:27    [15610357]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Sarbai
Я почитал про процедуру sp_rename везде пишут что нею переименовывать процедуры крайне не рекомендуют ибо она меняет даже то что с констрейнами.

У процедур нет констрейнтов

Sarbai
Мне бы чет такого рода деревяненького вроде ALTER PROCEDURE

Переименовать объекты можно только через sp_rename

Sarbai
+ сравнение с моей табличкой мол что есть в табличке моей оставить таким же, а чего нет переименовать.

Какое отношение переименование процедуры имеет к таблицам ?
22 фев 14, 13:51    [15610422]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Sarbai
я весьма глубоко хочу подходить к таким задачам.
Но кроме гуманитарных фантазий ничего не видно.
Реальность такая штука что надо понимать суть вещей а не фантазировать.
Прискорбно замечать что вам это не дано.
Или обложиться букварями по самый потолок и чудовищно работать годами без выходных и перерывов. Смогёте?

Как вернуть обратно:
ALTER SCHEMA [dbo] TRANSFER [Temp].[spMyProc1];
ALTER SCHEMA [dbo] TRANSFER [Temp].[spMyProc2];
-- ...
Удивительно, не правда?! Невозможно было догадаться!
23 фев 14, 01:37    [15613322]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Glory
Sarbai
Я почитал про процедуру sp_rename везде пишут что нею переименовывать процедуры крайне не рекомендуют ибо она меняет даже то что с констрейнами.

У процедур нет констрейнтов

Sarbai
Мне бы чет такого рода деревяненького вроде ALTER PROCEDURE

Переименовать объекты можно только через sp_rename

Sarbai
+ сравнение с моей табличкой мол что есть в табличке моей оставить таким же, а чего нет переименовать.

Какое отношение переименование процедуры имеет к таблицам ?



Насчет констрейнтов, я имел в виду что если оно меняет и поля тех таблиц в которых есть они (констрейнты). То где вероятность того что я поменяв имя процедуры, не поломаю где-то в другом месте, где моя процедура которая поменяла имя не вызывалась из другой процедуры. Насчет таблички это то что как мне правильно составить скрипт чтоб sp_rename проверяла наличие имени в таблице и не трогала процедуру с таким именем в базе всего-то. И повторюсь видать меня не так поняли, да буквари мне читать и читать я человек который не более месяца изучает данную технологию и до этого не имел вообще не каких дел с базами данных. И варианты вроде этого
CREATE SCHEMA [Temp] AUTHORIZATION dbo
GO
ALTER SCHEMA [Temp] TRANSFER [dbo].[spMyProc1];
ALTER SCHEMA [Temp] TRANSFER [dbo].[spMyProc2];

Как не прискорбно мне пока это осознавать ставят меня в ступор.
Думаю вопрос исчерпан, я примерно понял в каком направлении мне копать постараюсь методом тыка на своих ошибках. Всем спасибо за диалог.
23 фев 14, 03:17    [15613663]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

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

Спасибо я разобрался с этими схемами это весьма просто! Увы я самостоятельно прохожу информацию и ранее не знал куда и как эти схемы применять. Помогите пожалуйста подсказкой как правильно теперь составить единый скрипт, а может даже процедуру. Чтоб проверялась моя таблица с именами и если там нет имени, переносила в темп схему ту процедуру которой нет в моей табличке?
23 фев 14, 20:24    [15615669]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Попытаюсь прочитать мысли ТС, ибо месиво букав явно бессмысленны.

Sarbai, правильно ли я понимаю что у вас есть некая таблица, в которой прописаны имена процедур которые не надо трогать ?
А все остальные процедуры надо перенести в [Temp] ?

Sarbai
Насчет констрейнтов, я имел в виду что если оно меняет и поля тех таблиц в которых есть они (констрейнты).
Полная ахинея. Видимо вопрос про констрейнты так и останется загадкой.

Sarbai
То где вероятность того что я поменяв имя процедуры, не поломаю где-то в другом месте, где моя процедура которая поменяла имя не вызывалась из другой процедуры.
Блин, ну и гугл-транлейт.
Вам шашечки или ехать? Вопрос был про смену имени, а не про последствия или проверку целостности кода.
Если вам надо, так и спрашивайте - "Как проверить что изменяемая процедура не используется в неизменяемых?".
Но это другой вопрос и довольно сложный и имеет кучу вариантов решений, и зависит от версии сервера.

Я бы предложил копать в сторону sys.dm_sql_referenced_entities
Мне нравится в ней то, что она падает если есть ошибки в коде процедур (скриптовых объектах).
23 фев 14, 22:02    [15616043]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Mnior
Попытаюсь прочитать мысли ТС, ибо месиво букав явно бессмысленны.

Sarbai, правильно ли я понимаю что у вас есть некая таблица, в которой прописаны имена процедур которые не надо трогать ?
А все остальные процедуры надо перенести в [Temp] ?

Sarbai
Насчет констрейнтов, я имел в виду что если оно меняет и поля тех таблиц в которых есть они (констрейнты).
Полная ахинея. Видимо вопрос про констрейнты так и останется загадкой.

Sarbai
То где вероятность того что я поменяв имя процедуры, не поломаю где-то в другом месте, где моя процедура которая поменяла имя не вызывалась из другой процедуры.
Блин, ну и гугл-транлейт.
Вам шашечки или ехать? Вопрос был про смену имени, а не про последствия или проверку целостности кода.
Если вам надо, так и спрашивайте - "Как проверить что изменяемая процедура не используется в неизменяемых?".
Но это другой вопрос и довольно сложный и имеет кучу вариантов решений, и зависит от версии сервера.

Я бы предложил копать в сторону sys.dm_sql_referenced_entities
Мне нравится в ней то, что она падает если есть ошибки в коде процедур (скриптовых объектах).



Да вы меня правильно поняли. Есть некая таблица в которой собираются имена процедур которые не надо трогать. Насчет целостности упустим, это я заикнулся да не в те ворота, оно не имеет не какого отношения к моей проблеме.
23 фев 14, 22:29    [15616190]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Sarbai
Я написал процедуру которая дергает с помощью такой вот вюхи sys.dm_exec_procedure_stats системный кеш запускаемых процедур. Далее джоб запускает процедуру эту раз в 2 часа и складирует в табличку имена и еще некоторые параметры. Получиться за какое-то время я отобрал имена тех которые запускаются.
1. Ну это не значит что другие не запускаются (к примеру раз в год).
2. Остальные процедуры, это те которые есть в sys.procedures но нет в вашей. Банальный NOT Exists. И не забудьте исключить системные (или поставляемые MS).
Агрегировать строку можно через
FOR XML Path(''),TYPE).value('text()[1]','NVarChar(max)')
Хотя не обязательно - можно и руками ...
24 фев 14, 04:08    [15616959]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Mnior, в который раз с глупыми вопросами к тебе. Я все равно не могу понять как мне подавать имена или как сделать скрипт который подставлял бы под
ALTER SCHEMA [Temp] TRANSFER [dbo].[color=red][spMyProc1];[/color]
имена из моей таблицы. Пожалуйста можете мне начертить хотяб примерно конструкцию? Как вручную это сделать я то понимаю а как это сделать чтоб одним махом перебирало мою таблицу и подставляло имена увы пока не хватает соображалки(
24 фев 14, 12:13    [15618392]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
BuKTaP
Member

Откуда:
Сообщений: 132
Примерно так.
declare cc cursor for
--получаем имена процедур, которые нужно перенести/переименовать/etc
select name_sp
from ...
where name_sp not in (select названия_ваших_процедур_которые_НЕ_нужно_переносить from ваша_таблица)

declare @nam_sp nvarchar(100), @cmd nvarchar(150)
set @cmd = ''
set @nam_sp = ''
open cc
fetch from cc into @nam_sp

while @@fetch_status = 0
begin
   set @cmd = 'ALTER SCHEMA [Temp] TRANSFER [dbo].[' + @nam_sp +']'
   exec(@cmd)
end

close cc
deallocate cc

за синтаксис не ручаюсь, писал от руки
24 фев 14, 13:47    [15619320]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
хмхмхм
Guest
Mnior

При обоих подходах тело процедуры не меняется (хранит старое название


Minor, разъясните плз про подводные камни
24 фев 14, 14:23    [15619647]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
o-o
Guest
create schema unused;
go

declare @t table (name sysname);
insert into @t (name) values ('uspLogError') -- тут те, что не надо перемещать

select 'alter schema unused transfer ' + 
       quotename(SCHEMA_NAME(schema_id)) + '.' +
       quotename(name)
from sys.procedures p
where is_ms_shipped = 0
      and not exists (select 1 from @t t where p.name = t.name);


можно выполнить запрос в студии, нажав Resuts to Text.
полюбоваться на результат на предмет аномалий,
скопипастить полученные команды,
если все ок, выполнить.

учитывает схемы в системной таблице, но не учитывает их в Вашей таблице,
где сложены "используемые", если там со схемами, подправите условие в not exists.
24 фев 14, 14:57    [15619908]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
o-o
Guest
Mnior
Как вернуть обратно:
ALTER SCHEMA [dbo] TRANSFER [Temp].[spMyProc1];
ALTER SCHEMA [dbo] TRANSFER [Temp].[spMyProc2];
-- ...
Удивительно, не правда?! Невозможно было догадаться!


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

+ права слетят при перекидывании в другую схему,
так что если заранее не озаботиться, то и их снова раздать придется при переходе "взад"
24 фев 14, 15:02    [15619958]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
o-o
Guest
хмхмхм
Mnior
При обоих подходах тело процедуры не меняется (хранит старое название


Minor, разъясните плз про подводные камни


буквально и надо понимать.
была процедура dbo.my_sp,
в sys.sql_modules ее definition выглядит как create proc dbo.my_sp....
ни sp_rename, ни перенос в другую схему это определение (тело процедуры) не поменяет.
т.е. тот же sp_help или object_definition() будет по-прежнему выдавать create proc dbo.my_sp...,
хотя это уже никакая не dbo.my_sp, а unused.my_sp или dbo.my_NEW_sp
24 фев 14, 15:11    [15620040]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
o-o
Guest
пардон, имелся в виду не sp_help, а sp_helptext
24 фев 14, 15:12    [15620056]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
Ребят, спасибо за отзывы но видать толи я не так объясняю или меня не так понимают. Ваши варианты предполагают указание процедур которые не надо трогать как печень или в единичном варианте? Я выше описывал что есть таблица с полем "procName" в ней находятся те процедуры что не должны не куда перемещаться. Вот логика должна быть такой проверяется список всех процедур под определенной базой пользователя их там чет около 200 потом из этих 200 отбираются те что в табличке "procName" и вот уже те что остались должны дружненько за раз переместится в другую схему. Ваши варианты тоже меня научили интересным штукам но мою задачу не решают (
24 фев 14, 17:09    [15621092]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
хмхмхм
Guest
Sarbai
Ребят, спасибо за отзывы но видать толи я не так объясняю или меня не так понимают. Ваши варианты предполагают указание процедур которые не надо трогать как печень или в единичном варианте? Я выше описывал что есть таблица с полем "procName" в ней находятся те процедуры что не должны не куда перемещаться. Вот логика должна быть такой проверяется список всех процедур под определенной базой пользователя их там чет около 200 потом из этих 200 отбираются те что в табличке "procName" и вот уже те что остались должны дружненько за раз переместится в другую схему. Ваши варианты тоже меня научили интересным штукам но мою задачу не решают (


Обращаетесь к этой таблице, список всех процедур берете из sys.procedures, исключаете из него список процедур, которые хранятся в вашей таблице. Сохраняете список в табличную переменную или временную таблицу, далее в цекле с помощью динимического кода переименовываете\удаляете\переносите в другую схему.

А в чем у вас возникли проблемы?
24 фев 14, 17:15    [15621140]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Sarbai
Member

Откуда:
Сообщений: 11
хмхмхм
Sarbai
Ребят, спасибо за отзывы но видать толи я не так объясняю или меня не так понимают. Ваши варианты предполагают указание процедур которые не надо трогать как печень или в единичном варианте? Я выше описывал что есть таблица с полем "procName" в ней находятся те процедуры что не должны не куда перемещаться. Вот логика должна быть такой проверяется список всех процедур под определенной базой пользователя их там чет около 200 потом из этих 200 отбираются те что в табличке "procName" и вот уже те что остались должны дружненько за раз переместится в другую схему. Ваши варианты тоже меня научили интересным штукам но мою задачу не решают (


Обращаетесь к этой таблице, список всех процедур берете из sys.procedures, исключаете из него список процедур, которые хранятся в вашей таблице. Сохраняете список в табличную переменную или временную таблицу, далее в цекле с помощью динимического кода переименовываете\удаляете\переносите в другую схему.

А в чем у вас возникли проблемы?


Собственно в том, что я ms sql учу около месяца и вся эта последовательность на словах, что вы описали вроде мне понятна, но реализовать увы пока не могу не хватает знаний и понимания что за чем откуда)
24 фев 14, 17:38    [15621300]     Ответить | Цитировать Сообщить модератору
 Re: Как переименовать массово процедуры?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37228
Sarbai
Собственно в том, что я ms sql учу около месяца и вся эта последовательность на словах, что вы описали вроде мне понятна, но реализовать увы пока не могу не хватает знаний и понимания что за чем откуда)
Я бы на вашем месте сначала выучил бы, а потом бы уже что-либо где-либо брался переименовывать. Тем более, массово.

Сообщение было отредактировано: 24 фев 14, 17:45
24 фев 14, 17:45    [15621344]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить