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

Откуда: Левый берег
Сообщений: 415
Здравствуйте.

MS SQL SERVER 2008 R2

Есть табл., на таблицу ссылается множество процедур, функций. Требуется переименовать табл. и сохранить работоспособность процедур и функций, в ручную откомпилировать каждую нудно. как быть?
14 фев 12, 00:18    [12085617]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сделайте синоним на таблицу. Или вьюху. Или колбасьте код.
14 фев 12, 00:22    [12085631]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
1. rename myTable to myTableWithNewName

2. create view myTable as select * from myTableWithNewName
14 фев 12, 00:23    [12085638]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Алексаша
Member

Откуда: Левый берег
Сообщений: 415
Хотелось думать, что есть некий способ переименования объекта и обновление ссылок на него. Часто приходится разочаровываться в первоначально выбранном имени и вручную надоело наводить красоту :)
14 фев 12, 00:34    [12085685]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Алексаша
Хотелось думать, что есть некий способ переименования объекта и обновление ссылок на него. Часто приходится разочаровываться в первоначально выбранном имени и вручную надоело наводить красоту :)
Проблема не в том что это очевидно сделать в 90% случаев - но мол "не разрешают", а в том что
1. существуют случаи когда это сделать невозможно. Т.е. нет решений в общем виде.
2. Можно сделать множественными способами, но разными побочными результатами. Т.е. одной информации "что на что" мало. У всех пользователей требования разные и противоречивые.

Даже смена системного ID объекта может порушить пользовательские правила/систему. Или CRC процедуры.

Но никто не запрещает написать свою собственную пользовательскую систему переименовывания, И даже выложить её в общий доступ. :)
14 фев 12, 02:55    [12086058]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Lasa
Member

Откуда: Canada
Сообщений: 81
Наверное идиотский способ, но я в свое время им воспользовалась.
В SQL Server Managment Studio:
1. Rightn-clic на базе --> Tasks --> Generate Scrips
генерите скрипты на создание (drop and create) sp и функций, открываете этот скрипт --> Ctr+F и заменяете старое имя на новое в текущем документе, потом запускаете скрипт
15 фев 12, 03:42    [12092933]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Переименование объекта  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
Некропостинг, но задача та же:
EXECUTE sp_rename N'dbo.tbl_myOldTable', N'tbl_myNewTable', 'OBJECT' 
declare @t nvarchar(max)

DECLARE rowDefCursor CURSOR FOR 
			select definition
			from sys.all_sql_modules
			where CHARINDEX(N'tbl_myOldTable',definition)>0

		OPEN rowDefCursor;
		FETCH NEXT FROM rowDefCursor INTO @t;
		WHILE @@FETCH_STATUS = 0
		BEGIN
			set @t = replace(@t,N'CREATE PROCEDURE',N'ALTER PROCEDURE')
			set @t = replace(@t,N'CREATE FUNCTION',N'ALTER FUNCTION')
			set @t = replace(@t,N'tbl_myOldTable',N'tbl_myNewTable')
			exec @t
		FETCH NEXT FROM rowDefCursor INTO @t;
		end

		close rowDefCursor
		deallocate rowDefCursor


Что я делаю не так и чем мне это грозит?
11 апр 17, 11:56    [20388549]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
o-o
Guest
как минимум, поземеняется все, что имеет ту же подстроку в названии:
tbl_myOldTable123 --> tbl_myNewTable123,
proc dbo.sp_copy_from_tbl_myOldTable --> proc dbo.sp_copy_from_tbl_myNewTable,
...
11 апр 17, 12:12    [20388677]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
o-o,

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

Потому как такой же подход будет применятся огульно - нужно в процедуру добавить интовый параметр которого там не было? не проблема:
DECLARE rowDefCursor CURSOR FOR 
select definition from sys.all_sql_modules 
where charindex('proc_DeallocateCursorIfExist',definition,1)>0
and CHARINDEX('proc_DeallocateCursorIfExist @',definition,1)=0
and CHARINDEX('proc_DeallocateCursorIfExist] @',definition,1)=0
and OBJECT_NAME(object_id)<>'proc_DeallocateCursorIfExist'
----///---
---///---
--///---
set @t = replace(@t,N'[proc_DeallocateCursorIfExist]',N'proc_DeallocateCursorIfExist')
set @t = replace(@t,N'proc_DeallocateCursorIfExist',N'proc_DeallocateCursorIfExist @logID,')
11 апр 17, 12:27    [20388740]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Шыфл,

ну бывает ещё CRETE PROC :) + представления + функции
11 апр 17, 12:37    [20388780]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
o-o
Guest
Шыфл
Вызывает вопросы сама жизнеспособность такой конструкции - найдёт ли он всё и везде?

разумеется, не все.
лично я вообще всегда использую create proc,
и не пишу procedure полностью.
ну и кто знает, сколько пробелов, табуляций и прочего можно влепить между create и proc
11 апр 17, 12:40    [20388794]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Шыфл,

вообще для замены таблицы, можно
1) старую переименовываете как угодно ака _old
2) создаёте новую ака _new
3) создаёте представление с именем старой процедуры с внутренностями новой
4) больше не заморачиваетесь, а просто меняете представление.
11 апр 17, 12:47    [20388836]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
o-o
Шыфл
Вызывает вопросы сама жизнеспособность такой конструкции - найдёт ли он всё и везде?

разумеется, не все.

А что не найдёт? Ну, допустим, view, но они лично меня интересуют в последнюю очередь
o-o
ну и кто знает, сколько пробелов, табуляций и прочего можно влепить между create и proc

Это всё лирика, в крайнем случае упадёт в момент изменения (в базах реально встречается только CREATE PROCEDURE без пробелов).

Всё это делается для упгрэйда стандартного софта - там 2 части, общая и кустомная. Общая часть меняется стандартным скриптом, там все процедуры "знают в лицо", их меняют только полными скриптами, а вот с кустомной частью проблемы - у каждого клиента свои процедуры. И менять можно либо в ручную каждую процедуру, или вот так, через sys.all_sql_modules. Буду пробовать на бэкапах, отдам тестерам на съедение
11 апр 17, 13:07    [20388990]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
o-o
Guest
да то же название таблицы не найдет, если оно собирается динамически.
вот у нас туча таблиц кладется не в 1 секционированную,
а просто валят, дописывая дату и прочую муру в конце.
потом все хп конструируют имя динамически, собирая по частям.
разумеется, ваш реплэйс такое не отловит

К сообщению приложен файл. Размер - 19Kb
11 апр 17, 13:21    [20389093]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
aleksrov
Member

Откуда:
Сообщений: 948
o-o,

Это просто ад перфекциониста. Значит у меня просто идеальный порядок :)
11 апр 17, 13:27    [20389152]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
o-o
Guest
нет, это у меня начальницу перевели в другой отдел
и она им создает ад специально.
11 апр 17, 13:30    [20389173]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
o-o
нет, это у меня начальницу перевели в другой отдел
и она им создает ад специально.

Мы не ведём переговоры с террористами.

Протестирую, выложу грабли
11 апр 17, 13:33    [20389194]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
a.tarannikova
Member

Откуда:
Сообщений: 153
o-o
нет, это у меня начальницу перевели в другой отдел
и она им создает ад специально.


О_о
11 апр 17, 13:52    [20389304]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
Шыфл
Member

Откуда: Прага
Сообщений: 776
a.tarannikova
o-o
нет, это у меня начальницу перевели в другой отдел
и она им создает ад специально.

О_о

А вот и насяльника!

Итого:
Всё прекрасно работает.
sys.sql_modules (или sys.all_sql_modules) прекрасный источник для самомодифицируемого кода. Код процедур лучше начинать со строк коментариев с метаданными, версиями и т.п.

Код прекрасно парсится на строки по CHAR(10) - если нужно что-то совсем-совсем менять и обычный Replace не поможет (я так, к примеру, вырезал и вставлял целые блоки кода, когда серия одних стандартных операций заменялась на серию других - прям ДНК CRISPR-Cas, 8)

Основная запара - когда меняется колличество параметров процедур/функций, спасает прямое именование параметров. Но всё равно нужно тщательно тестировать, потому как варианты написания бывают самые разные. Однако это многим проще, чем вручную лопатить 100500 процедур/функций/триггеров.
13 апр 17, 18:27    [20400177]     Ответить | Цитировать Сообщить модератору
 Re: Переименование объекта  [new]
человек_ниоткуда
Guest
А про SQL Server Data Tools уже кто-то говорил?
Он халявно скачивается с мегадолларского сайта. Делаете проект SQL Database заливаете в него базюлюку и там уже есть инструмент для того что вам надо.
14 апр 17, 11:08    [20401668]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить