Подтвердить что ты не робот

Переименовать хранимую процедуру в SQL Server

Я пытаюсь переименовать хранимую процедуру в SQL Server 2008 с помощью sp_rename system sproc. Третий параметр мне затрудняет, и я продолжаю получать следующую ошибку:

Msg 15249, Level 11, State 1, Procedure sp_rename, Line 75
Error: Explicit @objtype 'P' is unrecognized.

Как указано в сообщении, я передаю значение P для значения параметра. Я вызываю sproc следующим образом:

EXEC sp_rename @objName = @procName, @newname = @WrappedName, @objtype = 'P';

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

select * from sys.objects where name = 'MySprocName'

и действительно, возвращаемый тип - P.

Кто-нибудь знает, что я должен здесь пройти? Я не хочу оставлять это пустым, так как я создаю общий sproc, чтобы между прочим переименовать произвольные sprocs и, если есть столкновение имен между sproc и чем-то другим, я не хочу об этом беспокоиться.

4b9b3361

Ответ 1

Согласно docs, 'P' не является правильным вариантом. Вы должны попробовать "OBJECT", поскольку это кажется самым близким к тому, что вы пытаетесь сделать. Но вы должны прислушаться к этому предупреждению...

Изменение любой части имени объекта может нарушать скрипты и хранить процедуры. Мы рекомендуем вам не использовать этот оператор для переименования сохраненного процедуры, триггеры, определяемые пользователем функций или представлений; вместо этого объекта и воссоздать его с помощью нового имя.

Также (из той же страницы MSDN):

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

Ответ 2

Просто опустите параметр @objtype (значение по умолчанию равно null), и оно будет работать.

EXEC sp_rename 'sp_MyProc', 'sp_MyProcName'

Вы получите следующее предупреждение, но процедура будет переименована

Внимание: изменение любой части имя объекта может разорвать скрипты и хранимые процедуры.

Как и другие, вы должны отказаться и заново создать процедуру.

Ответ 3

sp_rename не поддерживает процедуры:

Изменяет имя созданного пользователем объекта в текущей базе данных. Эта объект может быть таблицей, индексом, столбцом, псевдоним, или Microsoft.NET Рамки для общего языка (CLR) пользовательский тип.

Просто создайте новую процедуру с тем же телом и новым именем, затем оставьте старый.

Ответ 4

Я не уверен в переменной @objtype, однако я знаю, что переименование через sp_rename плохое.

Когда вы создаете сохраненный процесс, запись для него существует в sys.object, а определение сохраненного proc будет храниться в sys.sql_modules.

Использование sp_rename изменит имя только в sys.object, а не в sys.sql_modules, поэтому ваше определение будет неверным.

Лучшее решение - это падение и воссоздание

Ответ 5

В SQL 2000 дней было безопаснее использовать DROP/CREATE-- SQL, чтобы метаданные для proc не синхронизировались при использовании sp_rename.

Лучший способ узнать, как сделать фантастический DDL, как это, - использовать SSMS для переименования объекта, когда трассировка профайлера привязана.

Ответ 6

sp_rename только изменяет имя созданных пользователем объектов в базе данных. Переименование хранимой процедуры не изменит имя соответствующего имени объекта в столбце определения вида каталога sys.sql_modules.

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

Изменение любой части имени объекта может нарушать скрипты и хранимые процедуры.

За дополнительной информацией вы можете ознакомиться.

http://onlyforcoder.blogspot.in/2017/11/sprename-where-to-use-where-not-to-use.html http://blog.sqlauthority.com/2008/08/26/sql-server-how-to-rename-a-column-name-or-table-name/

Ответ 7

Все, что сказал Валентино Вранкен, правда. Однако имейте в виду, что когда вы бросаете и создаете хранимую процедуру, вы теряете все свои метаданные. (Create_Date, Modify_Date и т.д.)

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

Это также верно. Однако я обнаружил, что при запуске alter script после создания переименования он исправляет имя в определении в модулях.

Я задался вопросом, как интерфейс SSMS делает все это автоматически без использования T-SQL. (Возможно, он запускает alter script каждый раз, когда вы переименовываете SP с помощью интерфейса? Я не знаю.) Было бы интересно, чтобы MS публиковала, что происходит за кулисами, когда вы переименовываете SSMS.