elseiver: (I do IT)
elseiver ([personal profile] elseiver) wrote2013-08-06 03:26 am

ON ProjectCarrier.ProjectId = ProjectCarrier.ProjectId

Вот примерно такое условие, как в сабже, встретил вчера в продакшен-коде, в двух местах.
Понятно, что таких ошибок от невнимательности и опечаток возникает масса, и я боюсь предположить, сколько их в нашей базе кода.

Посему вопрос: не встречались ли уважаемые колеги с автоматическими тулзами, умеющими такие косяки отлавливать, по схеме базы данных, например?
Хочется запустить что-то такое и ужаснуться. Самому писать не хочется:)

[identity profile] evg25.livejournal.com 2013-08-06 08:49 am (UTC)(link)
Переходи на питон, он такое определяет как синтаксическую ошибку :-)

[identity profile] torrio.livejournal.com 2013-08-06 08:53 am (UTC)(link)
У меня десятки мегабайт исходников на дотнете, ошибки, которые я хочу найти - вообще в T-SQL, а ты мне предлагаешь перейти на питон?! Это, конечно, идеальное решение:)

[identity profile] evg25.livejournal.com 2013-08-06 08:54 am (UTC)(link)
Я знаю, что идеальное, потому и предлагаю. :-)

(мне смайлик побольше поставить?) :-)
Просто, когда я обнаружил это в питоне, то очень порадовался :-)

[identity profile] vgramagin.livejournal.com 2013-08-06 12:23 pm (UTC)(link)
Для Java мы используем Findbugs - он такое, безусловно, отлавливает.

[identity profile] torrio.livejournal.com 2013-08-06 12:33 pm (UTC)(link)
Он и в T-SQL отлавливает?!

[identity profile] vgramagin.livejournal.com 2013-08-06 12:51 pm (UTC)(link)
Умммм, не уверен что в таком виде сработает. Но наверняка есть статиканалайзеры и для SQL тоже.

[identity profile] torrio.livejournal.com 2013-08-06 12:35 pm (UTC)(link)
В целом, для C# у нас есть Re-Sharper, он со многим справляется и подсказывает всякое полезное, но вот оказалось, что есть еще непаханное поле в SQL... По идее, у нас куплен Red Gate SQL Tolbelt, но не факт, что он умеет:(

[identity profile] antomus.livejournal.com 2013-08-06 03:33 pm (UTC)(link)
Если нужно только такие вот повторы найти, то можно использовать регулярные выражения например. Они так могут. Правда это не совсем подходит под определение "автоматической тулзы"...
Edited 2013-08-06 15:35 (UTC)

[identity profile] torrio.livejournal.com 2013-08-06 04:25 pm (UTC)(link)
Тут немного сложнее. Тот пример, который я привел - такое тоже, конечно, случается, но в реальности, например, было написано вот так:

ON ProjectCarrier.ProjectId = ProjectId

Имелось в виду поле ProjectId из другой таблицы, но у парсера SQL свой взгляд на это:) И его нужно учитывать. Под "простой повтор" такая штука уже не подпадает...

[identity profile] elder-george.livejournal.com 2013-08-06 06:21 pm (UTC)(link)
Хммм, мне SSMS выдал ошибку Msg 209, Level 16, State 1, Line 10
Ambiguous column name 'projectid'.
.

Пробовал вот так:


declare @ProjectCarrier table(
ProjectId INT NOT NULL
)

declare @Project table(
ProjectId INT NOT NULL
)

select * from @ProjectCarrier pc
inner join @project on pc.ProjectId = ProjectId


Ты что-то скрываешь!

[identity profile] torrio.livejournal.com 2013-08-06 06:38 pm (UTC)(link)
Честное слово не вру! Ambiguous column name не возникло потому, что этот запрос был вложенный, и, видимо, ambiguity разрешилась за счёт более низкого приоритета таблицы из внешнего запроса...

[identity profile] elder-george.livejournal.com 2013-08-06 06:45 pm (UTC)(link)
Коллеги подсказали, что есть, например, http://www.sqlcodeguard.com/ (плагин к SSMS) и http://www.ubitsoft.com/products/t-sql-analyzer/index.php (+ платная версия к нему). Может, ещё что-то подскажут…


Сам не пробовал. Ну и у нас SQL код отличный же =)

[identity profile] torrio.livejournal.com 2013-08-06 06:48 pm (UTC)(link)
Спасибо!

[identity profile] elder-george.livejournal.com 2013-08-06 06:49 pm (UTC)(link)
О, вот тут рассказывают, как гонять static analysis на SQL проектах. Правда, там тоже набор правил фиксированный, не факт, что покрывает твои сценарии.

[identity profile] 5-sb-werewolf93.livejournal.com 2013-08-06 06:18 pm (UTC)(link)
меня в мои косяки тыкает решарпер, но не думаю что он на столько глубоко анализирует код.

[identity profile] torrio.livejournal.com 2013-08-06 06:39 pm (UTC)(link)
Решарпер вроде как с T-SQL не работает... В C#, да, помогает!