powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ базы на синтаксические ошибки из командной строки
25 сообщений из 27, страница 1 из 2
Анализ базы на синтаксические ошибки из командной строки
    #40030511
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!

Хочется добавить в процесс CD проверку базы на синтаксические ошибки, желательно не очень дорого, но никак не могу напась на след. SQL Toolbelt дорого, нашел SQL Code Guard, он не поддерживается да и работает ли из команднойл строки непонятно. Думал прикрутить к SSDT, но никак не соображу, как автоматизировать.
Спасибо за совет!

С уважением, Князев Константин
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030532
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
проверку базы на синтаксические ошибки
Расшифруйте.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030542
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

проверка хранимых процедур на компилируемость, корректность имен таблиц, колонок.
нарыл Checking MS SQL Server Stored Procedures , только многие процедуры долго выполняются, поэтому не подходит.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030550
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030555
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

импортируйте базe в проект Data Tools Visual Studio, сразу всё увидите.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030567
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey Syrovatchenko,

это интересно, изучаю, спасибо

Владислав Колосов,

процесс разработки отлажен, менять не целесообразно, настроены билд и деплой через TeamCity, поэтому база первична. Т.е. для проверки надо по базе генерить проект SSDT и в нем пускать Build, но я не нашел пока способа, как генерить проект по базе.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030581
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
нарыл Checking MS SQL Server Stored Procedures , только многие процедуры долго выполняются, поэтому не подходит.
Можете там заменить SET @exec = 'EXEC ' + @proc + ' ' + ISNULL(@params, '') на SET @exec = 'set fmtonly on; EXEC ' + @proc + ' ' + ISNULL(@params, '') - станет значительно быстрее.
Но так проверить можно только процедуры и скалярные функции.

Имхо, самый простой способ:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
if exists(select 1 from sys.servers where name = N'Loopback001')
 exec sys.sp_dropserver N'Loopback001', N'droplogins';

exec sys.sp_addlinkedserver @server = N'Loopback001', @srvproduct = N'', @provider = N'SQLNCLI', @datasrc = @@servername;
exec sys.sp_addlinkedsrvlogin @rmtsrvname = N'Loopback001', @useself = N'True';--, @locallogin = null, @rmtuser = null, @rmtpassword = null
exec sys.sp_serveroption @server = N'Loopback001', @optname = N'rpc out', @optvalue = N'true';
go


declare @query nvarchar(max) = N'use %db%; declare @referenced_id int; select top (1) @referenced_id = referenced_id from sys.dm_sql_referenced_entities(''%module%'', ''%module_class%'');'

declare m cursor local fast_forward for
 select
  a.module, b.module_class,
  replace(replace(replace(@query, N'%module%', a.module), N'%module_class%', b.module_class), '%db%', quotename(db_name())) 
 from
  sys.sql_modules m left join
  sys.triggers t on t.[object_id] = m.[object_id] and t.parent_class_desc = N'DATABASE' left join
  sys.server_triggers st on st.[object_id] = m.[object_id] and db_name() = N'master' cross apply
  (select isnull(quotename(object_schema_name(m.[object_id])) + N'.', '') + quotename(object_name(m.[object_id]))) a(module) cross apply
  (
   select
    case
     when st.[object_id] is not null then N'SERVER_DDL_TRIGGER'
     when t.[object_id] is not null then N'DATABASE_DDL_TRIGGER'
     else N'OBJECT'
   end
  ) b(module_class);

declare @result table (module nvarchar(517), error_text nvarchar(2048));
declare @s nvarchar(max), @module nvarchar(517), @module_class nvarchar(60), @referenced_id int;

open m
while 1 = 1
 begin
  fetch next from m into @module, @module_class, @s;
  if @@fetch_status <> 0
   break;

  begin try
   exec(@s) at Loopback001;
  end try
  begin catch
   insert into @result
    (module, error_text)
   values
    (@module, error_message());
  end catch;
 end;

select * from @result;
go

if exists(select 1 from sys.servers where name = N'Loopback001')
 exec sys.sp_dropserver N'Loopback001', N'droplogins';

...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030590
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

спасибо! пробовал noexec, а про fmtonly забыл...

а в чем смысл выполнения на лупбек сервере, в чем отличие от локального?
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030593
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Обманул. Можно еще проще
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
declare m cursor local fast_forward for
 select
  a.module, b.module_class
 from
  sys.sql_modules m left join
  sys.triggers t on t.[object_id] = m.[object_id] and t.parent_class_desc = N'DATABASE' left join
  sys.server_triggers st on st.[object_id] = m.[object_id] and db_name() = N'master' cross apply
  (select isnull(quotename(object_schema_name(m.[object_id])) + N'.', '') + quotename(object_name(m.[object_id]))) a(module) cross apply
  (
   select
    case
     when st.[object_id] is not null then N'SERVER_DDL_TRIGGER'
     when t.[object_id] is not null then N'DATABASE_DDL_TRIGGER'
   end
  ) b(module_class);

declare @result table (module nvarchar(517), error_text nvarchar(2048));
declare @module sysname, @module_class nvarchar(20);

open m
while 1 = 1
 begin
  fetch next from m into @module, @module_class;
  if @@fetch_status <> 0
   break;

  begin try
   if @module_class is null
     exec sys.sp_refreshsqlmodule @module;
   else
     exec sys.sp_refreshsqlmodule @module, @module_class;
  end try
  begin catch
   insert into @result
    (module, error_text)
   values
    (@module, error_message());
  end catch;
 end;

select * from @result;
go
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030595
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
а в чем смысл выполнения на лупбек сервере, в чем отличие от локального?
На локальном, в зависимоти от версии сервера, исключение не ловится.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030601
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправление для обоих вариантов:
Код: sql
1.
2.
 select
  coalesce(a.module, t.name, st.name), b.module_class


Проблемы:
- для линкеда не будут валидироваться DDL-триггеры
- для sp_refershsqlmodule не будут валидироваться функции из вычисляемых столбцов таблиц.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030629
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

спасибо
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030690
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
Sergey Syrovatchenko,

это интересно, изучаю, спасибо

Владислав Колосов,

процесс разработки отлажен, менять не целесообразно, настроены билд и деплой через TeamCity, поэтому база первична. Т.е. для проверки надо по базе генерить проект SSDT и в нем пускать Build, но я не нашел пока способа, как генерить проект по базе.

Не совсем понял, причем тут Team City. Пусть деплоит себе как деплоил, он никак не мешает. Вы разработку в текстовом редакторе ведете? Эта методика давно устарела, переходите на студию. Студия проверит все ссылки и невалидные определения. А как вы развертывание тестируете, тоже TC гоняете? Это не эффективно - слишком медленно получаете обратную связь.
Ну, да дело хозяйское - деньги платят и ладно.

Советую найти книгу Рефакторинг баз данных: эволюционное проектирование.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030715
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
А как вы развертывание тестируете, тоже TC гоняете? Это не эффективно - слишком медленно получаете обратную связь.
Ничего же плохого нет в ещё одной проверке.
Понятно, каждый разработчик проверяет у себя свой код, но можно и итоговую проверку добавить.
Конечно, это медленно, но всё равно же в общем процессе, т.е. накатывание новой версии на тестовый сервер всё равно идёт не в реалтайме по мере программирования, а делается по некоему расписанию, как часть (фаза) общего процесса разработка-билд-тестирование-деплой-эксплуатация. Обсуждаемая проверка есть часть фазы "билд".
Zelius
Хочется добавить в процесс CD проверку базы на синтаксические ошибки, желательно не очень дорого
Билд же накатывается на тестовый сервер, вот тут то и будет проверка "на синтаксические ошибки". Зачем тратить ресурсы, и дополнительно вносить в процесс нечто, требующее внимания и поддержки для того, что и так сделается?
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030720
Фотография env
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А приведённые выше механизмы отлавливают ошибки вида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create procedure dropme_p as
begin
    select 100 id into #t;
    
    select id2 from #t;
end;
go

--Procedure created.

exec dropme_p;

--Invalid column name 'id2'.


?
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030722
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов,

Я уже конвертировал проект в SSDT, он получается очень большой ( под 7000 объектов, легаси монолит), много связей между базами, серверами, логины, джобы, выборки xml, и завести его без проблем у меня не получилось, сейчас вроде подлатали SSDT (последний раз разбирался года 3 назад). Так же не понял, как делать предплой и пост деплой, он упорно один файл предлагал, а нужно на каждый релиз, и что бы старые невыполнялись, но поразбираюсь еще... Еще проблема, что некоторые разработчики его в глаза не видели.

alexeyvg,

да, каждый разработчик проверяет свой код, но все таки периодически проскакивает ошибка в имени таблицы и колонки и всплывает только на этапе эксплуатации (( вот хотя бы от этого хотел защититься
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030727
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
env
А приведённые выше механизмы отлавливают ошибки вида...
Нет.
Потому что это ошибка выполнения.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030731
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
да, каждый разработчик проверяет свой код, но все таки периодически проскакивает ошибка в имени таблицы и колонки и всплывает только на этапе эксплуатации (( вот хотя бы от этого хотел защититься
Я же писал про тестовый сервер.
Никакой проверкой в любом случае вы не выловите даже все простые, условно "синтаксические", ошибки, не говоря уже о более многочисленных остальных.
Соответственно, в процессе, кроме разработчиков, волшебной "проверки", и прода, должен быть этап "деплой на тестовый сервер" и прогон теста.
Даже самый примитивный, на первое время, тест, выявит много проблем до этапа эксплуатации.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030734
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

деплой на тестовый сервер делается, простые ошибки выявляет. тесты это хорошо, но ресурсы на 7000 тестов никто не выделит да и самому делать это застрелишься (недавно сделал пару тестов на tSQLt, долго и нудно) :( есть Red-Gate с SQL Change Automation, но он входит в состав пакета за 3500 не рублей, и падает с переполнением стека на нашей базе. Сейчас думаю, как прикрутить SSDT... Пока есть мысль сделать шаблонный проект, потом новым скриптером скриптовать базу, вставлять своими руками ссылки на скрипты в проект, запускать msbuild и ловить ошибки.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030794
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

Если вы не используете SSDT, то в чем же вы разработку БД ведете? Просто интересно.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40030806
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael,

в файлах, SSMS
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40031013
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

Жесть. Окей, попробую вкратце описать возможный воркфлоу. Сразу скажу, что это не единственный возможный подход, но в моих обстоятельствах я так делал, и все работало. Если у вас система на продажу, с кучей клиентов, то задача усложняется, хотя невозможной это ее не делает - я лично знаю как минимум одну компанию, которая ведет свою БД в SSDT и которая продает свою систему и предоставляет возможность кастомизации под нужды отдельных клиентов (Fenergo). Как именно они это делают, и сколько ручного труда у них на это тратится - без понятия, но учитывая, что многие вещи можно сделать через командную строку с msbuild, возможно они многое автоматизировали.

А, да - насчет лицензий. Если у вас в компании есть лицензии VS, то все просто - ставите VS 2019 (ну или последнюю, какая будет в будущем) соотв. редакции и вперед. Если нет, то ставите Community Edition и при установке выбираете единственный workload - Data Processing или как-то там. В этом случае лицензия не нужна .

На каждую из имеющихся у вас БД создаете отдельный проект базы в SSDT. После создания проекта и выставления его настроек (коллейшн и прочее) в панели Solution Explorer правой кнопкой на проекте -> Import Schema . Затягиваете из имеющейся БД всю схему в проект, потом смотрите есть ли ошибки. Сначала билдите проект, потом пытаетесь задеплоить его в пустую БД. Последнее, на самом деле, довольно надежный тест, ловит очень многое (но конечно не всё).

Зависимости между базами в SSDT реализуются через механизм Database Reference . Сразу скажу, что чистить свеже-импортированный код, чтобы заменить все 3- и 4-частные имена на соответствующие SQLCMD-переменные, это как чистить ведро ершей - работка та еще, и запросто может занять несколько дней на большой и сложноподчиненной базе. По счастью, в основной своей части это просто тупая рутина в виде кучи Ctrl-Shift-F / Ctrl-Shift-H. Кроме того, конкретно эту задачу обычно приходится выполнять только один раз, в процессе перевода разработки на SSDT. Постепенно народ привыкает, что все изменения должны исходить из проекта, а не из базы, несогласных увольняют, и ситуация стабилизируется.
Единственная серьезная проблема, с которой можно столкнуться на этой стадии - это циклические зависимости между БД. Тут скорее всего вам придется заняться редизайном, потому что подобная ситуация неправильна в принципе, и будет создавать проблемы при любом способе деплоймента, какой бы вы ни выбрали. В идеале, граф зависимостей между вашими БД должен быть направленным и ациклическим (а еще лучше - деревом).

Собственно написание кода в SSDT не отличается от любого другого редактора. Разве что обращение к объектам других БД приходится делать через SQLCMD-переменные, типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
-- What you write in SSDT
select t.* from dbo.MyTable t
where not exists (select 0 from [$(AnotherDB)].dbo.AnotherTable rt where rt.ReferenceId = t.Id);

-- What you see in DB after deployment
select t.* from dbo.MyTable t
where not exists (select 0 from [AnotherDBName].dbo.AnotherTable rt where rt.ReferenceId = t.Id);


Деплой изменений из проекта в базу можно делать несколькими способами:
  • Во-первых, есть Schema Compare , где можно точечно исключить объекты или классы объектов (чаще всего это пользователи и их членство в ролях, т.к. эти вещи как правило environment-specific, и в проект их лучше не включать вообще).
  • Во-вторых, можно создать Publishing Profile и включить его в проект как отдельный файл (и как следствие, включить его в source control). Насколько я понимаю, его можно будет дергать из командной строки, через вызов msbuild.
Оба эти способа позволяют как выкатить изменения напрямую, так и сгенерировать скрипт с изменениями, который при необходимости можно подправить вручную, перед его выполнением.

Также имеется Data Compare , которую можно использовать для быстрого деплоя эталонных данных на тестовую БД.

Про полную интеграцию с Git, полагаю, можно даже не упоминать.


В принципе, вроде бы все. Из моего личного опыта могу сказать, что на данный момент я внедрял SSDT в трех компаниях (причем я там был контрактором, а не перманентным эмплоем, и делал это по собственной инициативе), и во всех случаях внедрение было успешным. Естественно, поначалу люди сопротивляются, но когда они видят преимущества, которые дает данный тул, и им удается перестроить свой способ мышления, то в конечном итоге некоторые даже говорят "спасибо".

P.S. Если вы посмотрите внимательно, то заметите, что большая часть приведенных ссылок ведет на один и тот же раздел в документации. Пошерстите там, наверняка найдете много полезного.
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40031043
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ennor Tiegael, спасибо за такой развернутый ответ!

на самом деле не такая уж и жесть, все объекты версионированны и лежат TFS у нас написана тулза, которая собирает релизные скрипты, проекты в SSMS вести удобно, объединяю в проекты по задачам, но вот захотелось подстелить соломки...

С SSDT я работал, на другой базе, маленькой, но вот большую перевести не получилось на тот момента (года 3 назад), слишком много было ошибок связанных с выборкой из xml, связями с другими базами, логинами и еще чем то, и не решил вопрос с пре и пост деплоями.

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

Я не понял, если есть Database Reference, то зачем использовать slqcmd параметры $(AnotherDB)?
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40031049
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот интересная статья про организацию пре и пост деплоя, осталось только придумать что бы сохранять их в TFS и они вызывались только на своих релизах...
...
Рейтинг: 0 / 0
Анализ базы на синтаксические ошибки из командной строки
    #40031095
Фотография Ennor Tiegael
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius
у нас написана тулза, которая собирает релизные скрипты, проекты в SSMS вести удобно, объединяю в проекты по задачам, но вот захотелось подстелить соломки...
Неудобно, я видел как выглядит данный процесс, деплой базы занимает целый день.

Такая ситуация: допустим вы добавили новое поле в таблицу. Как ваша тулза будет генерить change script - через drop / create, что ли? Или вы храните не единственный create table, а всю цепочку альтеров в скрипте создания таблицы? Представляю, как будет выглядеть такой скрипт после добавления пары десятков столбцов.

В SSDT такой проблемы нет, она все это понимает и умеет. В проекте хранятся именно что скрипты создания объектов, а как именно будет выглядеть change script, переводящий базу из произвольного состояния в состояния проекта, генерится на ходу.
Zelius
С SSDT я работал, на другой базе, маленькой, но вот большую перевести не получилось на тот момента (года 3 назад), слишком много было ошибок связанных с выборкой из xml, связями с другими базами, логинами и еще чем то, и не решил вопрос с пре и пост деплоями.
Логины, за редким исключением, в проект помещать не стоит, хотя безусловно это можно сделать. При деплое их можно исключить из сравнения, как в Schema Compare, так и в Publishing Profile (не знаю, как быть в случае с dacpac, не пользовался этим механизмом никогда, но скорее всего должен быть способ).
Насчет ошибок при выборке из xml - не понял. В старых версиях были моменты, когда SSDT не понимала какой-то легальный синтаксис, сталкивался с этим, но это все фиксится .
Также не очень понял, что именно вы называете пре- и пост-деплоями. В SSDT это есть , но они работают только при развертывании через publish profile, а Schema Compare их игнорирует. Что вы туда собираетесь помещать такого, чтоб прям каждый раз выполнять надо было?
Zelius
Перекрестные ссылки как разбирать не понятно, при сильной связанности, dacpac может делать, а не живую базу...
Сильно связанные базы это вообще изрядная головная боль. Можно спросить себя, а нужны ли отдельные базы как таковые, если они настолько сильно связаны? Может проще все перенести в одну.
У меня был один случай, когда горе-девелоперы сделали кучу циклических ссылок между основной и дополнительной БД. Ну, историю про Гордиев узел помните? Вот как-то так.
Zelius
Я не понял, если есть Database Reference, то зачем использовать slqcmd параметры $(AnotherDB)?
Когда вы добавляете Database Reference в проект, то для него автоматически создается SQLCMD-переменная, по которой вы обращаетесь к объектам внутри этого референса.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Анализ базы на синтаксические ошибки из командной строки
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]