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

Откуда:
Сообщений: 53
Решил сделать сохранение и восстановление своих хранимых процедур, функций и триггеров.
Программа при помощи запроса читает нужные процедуры, функции, триггеры и записывает их в текстовый файл.
Всё это замечательно работает я смотрю в файлы в них лежат тексты нужные с моими комментариями.
Когда же я программно делаю Drop, а потом Create, то процедуры, функции и триггеры в базе появляются но в текстах нет моих комментариев.

Очень мне хочется комментарии сохранить.

Вот например. Есть такой текст в файле:

CREATE PROCEDURE [dbo].[_GetAcquiringTerminal] @CompName nvarchar(100) = ''
-- Выводит список Эквайринг терминалов, подключенных к указанному компьютеру
AS
BEGIN
	SET NOCOUNT ON;
	if @CompName <> '' Begin
		Select	DeviceID 
		  From	tb_WPAuthPType as t, tb_WorkPlace as wp 
		 Where  wp.CompName = @CompName And	
				LinkID = wp.ObjID 
	end
END

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

Что я неправильно делаю при пакетной записи?
16 сен 15, 22:53    [18158516]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Glory
Member

Откуда:
Сообщений: 104751
EdGreen
Я отправляю этот текст как есть в качестве запроса к базе

Отправляете чем ?
И что приходит на сервер ?
16 сен 15, 23:00    [18158540]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Отправляю через ODBCDatabase.
Трассировщиком посмотрел действительно сервер получает всё уже без комментариев.
А как же быть - то?
16 сен 15, 23:20    [18158593]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Jaffar
Member

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

да ты сделай табличку на сервере,
типа
object_name
object_type
object_SQL_CODE - текст объекта

и туда складывай.
и потом просто бери оттуда и делай exec(object_SQL_CODE) - и все будет хорошо.
А то у тебя наверное в твоей проге где-нить галочка есть - типа удалять комментарии, а ты забыл ее снять.
17 сен 15, 06:12    [18158847]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Glory
Member

Откуда:
Сообщений: 104751
EdGreen
Отправляю через ODBCDatabase.
Трассировщиком посмотрел действительно сервер получает всё уже без комментариев.
А как же быть - то?

Не использовать какие-то левые утилиты для работы с сервером
17 сен 15, 07:34    [18158907]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Спасибо за идею.

Сделал так:
	глРестартПростоВыполнитьЗапрос("Exec('"+СтрЗаменить(СокрЛП(Тек.Текст), "'", "''")+"')");

То есть передал текст процедуры через драйвер не как скрипт, а как текстовую константу и всё благополучно сработало.
17 сен 15, 20:44    [18163016]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
EdGreen
То есть передал текст процедуры через драйвер не как скрипт, а как текстовую константу и всё благополучно сработало.
Кхе, а как ещё можно было передать текст не как текст? У меня даже никаких идей не появляется
17 сен 15, 22:04    [18163250]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31961
alexeyvg
EdGreen
То есть передал текст процедуры через драйвер не как скрипт, а как текстовую константу и всё благополучно сработало.
Кхе, а как ещё можно было передать текст не как текст? У меня даже никаких идей не появляется
А, ну да, этот левый глРестартПростоВыполнитьЗапрос удаляет комментарии из передаваемого текста, а таким образом не удалит. Понятно...
17 сен 15, 22:06    [18163254]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
o-o
Guest
alexeyvg
EdGreen
То есть передал текст процедуры через драйвер не как скрипт, а как текстовую константу и всё благополучно сработало.
Кхе, а как ещё можно было передать текст не как текст? У меня даже никаких идей не появляется

фотографией, например.
+ на планшете тоже ничего, хотя бумагой все же лучше

17 сен 15, 23:41    [18163601]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Jaffar
Member

Откуда:
Сообщений: 633
EdGreen
Jaffar,

Спасибо за идею.

Сделал так:
	глРестартПростоВыполнитьЗапрос("Exec('"+СтрЗаменить(СокрЛП(Тек.Текст), "'", "''")+"')");

То есть передал текст процедуры через драйвер не как скрипт, а как текстовую константу и всё благополучно сработало.


Я то рассчитывал что вы сделаете что-то вроде этого:

insert t_SaveObjects(shcema, name, type, T_SQL)
select s.name, o.name, o.type, m.definition '"Это и есть текст процедуры/функции/триггера и т.п.'
from sys.objects o with(nolock)
join sys.schemas s with(nolock) on s.schema_id = o.schema_id
join sys.sql_modules m on m.object_id = o.object_id
where
		o.name  like  'flex_%'
and		s.name  = 'dbo'
order by s.name asc, o.name asc
18 сен 15, 06:21    [18163775]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Ты меня своей подсказкой натолкнул сразу на две идеи: Как доделать то, и как сделать историю версий.

Получилась вот такая процедура:

USE [RestartMain]
GO
/****** Object:  StoredProcedure [dbo].[_ObjectsSave]    Script Date: 09/17/2015 22:14:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
Alter PROCEDURE [dbo].[_ObjectsSave] 
AS
BEGIN
	-- SET NOCOUNT ON;
	IF  NOT EXISTS (SELECT * FROM [RestartGreen].sys.objects WHERE object_id = OBJECT_ID(N'[RestartGreen].[dbo].[StoredPFT]') AND type in (N'U'))
	Begin
		SET ANSI_NULLS ON
		SET QUOTED_IDENTIFIER ON
		SET ANSI_PADDING ON
		CREATE TABLE [RestartGreen].[dbo].[StoredPFT](
			[name] [sysname] NOT NULL,
			[DateAdd] [datetime] NOT NULL,
			[type] [char](2) NOT NULL,
			[text] [nvarchar](max) NULL
		) ON [PRIMARY]
		SET ANSI_PADDING OFF
	End
	Insert into  RestartGreen.dbo.StoredPFT (name, DateAdd, type, text)
	SELECT	s.name,						-- Сначала добавим те объекты, которые изменились
			DateAdd = GetDate(),
			s.type, 
			text = m.definition 
	   FROM [RestartMain].sys.objects as s, [RestartMain].sys.sql_modules as m, RestartGreen.dbo.StoredPFT as c 
	  WHERE s.type in ('P', 'FN','TR') 
			AND  s.name NOT IN (Select d.name from RestartDemo.Sys.objects as d) 
  			AND  m.object_id = s.object_id
  			AND  c.name = s.name
  			AND  c.DateAdd = (Select Max(Dateadd) from RestartGreen.dbo.StoredPFT as cc where cc.name = c.name)
  			AND  c.text <> m.definition

	Insert into  RestartGreen.dbo.StoredPFT (name, DateAdd, type, text)
	SELECT	s.name,						-- Теперь новые
			DateAdd = GetDate(),
			s.type, 
			text = m.definition 
	   FROM [RestartMain].sys.objects as s, [RestartMain].sys.sql_modules as m
	  WHERE s.type in ('P', 'FN','TR') 
			AND  s.name NOT IN (Select d.name from RestartDemo.Sys.objects as d) 
			AND  s.name NOT IN (Select c.name from RestartGreen.dbo.StoredPFT as c) 
  			AND  m.object_id = s.object_id 
END


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

Такая трассировка версий.
Остаётся вставить в какой-нибудь шедулер и вся история разработки будет храниться.
18 сен 15, 12:46    [18165095]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Glory
Member

Откуда:
Сообщений: 104751
EdGreen
и вся история разработки будет храниться.

Откуда же "вся история" то ?
Это будут состояния на какие-то моменты времени.
Вся история будет, если вы будете отлавливать событие изменения/создания
18 сен 15, 12:49    [18165119]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Попутно вопрос.
Я, практически не пользуюсь join'ами. В данном конкретном случае, мне кажется, получается тот же эффект. Может я чего не понимаю? Может там какая доп. оптимизация теряется? Или это чисто для наглядности?
18 сен 15, 12:49    [18165120]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Glory
Member

Откуда:
Сообщений: 104751
EdGreen
ожет там какая доп. оптимизация теряется? Или это чисто для наглядности?

Это называется стандарт языка
Потому что join больше одного, которым вы пользуетесь опосредованно через where
18 сен 15, 12:52    [18165155]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

Откуда:
Сообщений: 53
Шерлок Холмс с Доктором Ватсоном путешествуют на воздушном шаре. Ветром их унесло неизвестно куда, опускаются, видят дом, возле него человек.

-- Сэр, не подскажите ли вы нам, где мы сейчас находимся?
-- Вы находитесь сейчас в гондоле воздушного шара.

Следующий порыв ветра уносит их от этого дома.

-- Ватсон, этот человек математик. Его ответ абсолютно точен и абсолютно бесполезен.

Без обид :)
18 сен 15, 14:17    [18165726]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Glory
Member

Откуда:
Сообщений: 104751
EdGreen
-- Ватсон, этот человек математик. Его ответ абсолютно точен и абсолютно бесполезен.

А анекдот про чукчу, который холодильник телевизором называл, тоже помните ?
18 сен 15, 14:20    [18165739]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Jaffar
Member

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

нужно сделать триггер на базу. DDL триггрер.
И в нем писать в какую-нить табличку историческую.
21 сен 15, 09:28    [18173641]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Ну не настолько историческая нужна история разработки. Так, когда сомнения гложут -- сохраниться.
22 сен 15, 17:37    [18181797]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
Rem
Member

Откуда:
Сообщений: 261
EdGreen, не пробовали выгружать, например, скриптом на PowerShell по расписанию всю структуру, включая код sp, udf и проч. в текстовые файлы, а на каталог натравить какую-нибудь систему контроля версий, типа Mercurial или SVN.
22 сен 15, 17:45    [18181824]     Ответить | Цитировать Сообщить модератору
 Re: Пакетное создание хранимых процедур с сохранением комментариев  [new]
EdGreen
Member

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

Всё, как известно, зависит от задачи.

В данном случае аддитивный бэкап заведён на боевом сервере, он делает еженочные копии всей системы. (Однажды очень меня выручил).

А разработка ведётся на полигоне.
Так вот задача была немножко автоматизировать перенос изменений в процедурах, триггерах и функциях, сделанных на полигоне на боевой сервер. Кроме того, говорю же, иногда хочется сохраниться, перед сомнительным экспериментом. А ещё бывают периодические обновления базового приложения, которое реструктуризирует базу и, в процессе, прибивает сторонние процедуры.
25 сен 15, 17:23    [18196255]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить