SQL Server 2008: как загрузить / проанализировать сценарий SQL из TSQL? - PullRequest
0 голосов
/ 05 июня 2009

Работал с SQL Server, так как это был Sybase (начало 90-х для зеленых), и я немного озадачен этим.

В Oracle и DB2 вы можете передать пакет SQL или сценарий хранимой процедуре, чтобы проверить, можно ли ее проанализировать, а затем выполнить условную логику на основе результата, как в следующем примере псевдокода:

if (TrySQLParse(LoadSQLFile(filename)) == 1
   { execute logic if parse succeeds }
else
   { execute logic if parse fails }

Я ищу системный протокол или аналогичную функцию в SQL Server 2008 - не SHOWPLAN и т. П. - для анализа большого набора сценариев из процедуры TSQL, а затем для условного контроля обработки исключений и выполнения сценариев на основе результаты, достижения. Но я не могу найти похожую простую штуковину в TSQL.

Есть идеи?

Ответы [ 4 ]

1 голос
/ 05 июня 2009

Общий хакерский способ сделать это в любой технологии, которая выполняет полный синтаксический анализ / компиляцию перед выполнением, состоит в том, чтобы добавить к коду, о котором идет речь, что-то, что приводит к остановке выполнения. Например, чтобы проверить, проходит ли vbscript проверку синтаксиса без его фактического запуска, я добавляю:

Wscript.exit(1)

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

Я думаю, что аналогом в мире sql является повышение ошибки высокой степени серьезности. Если вы используете уровень серьезности 20+, это разрушает соединение, поэтому, если в сценарии несколько пакетов, они все пропускаются. Я не могу подтвердить, что 100,00000% не может быть, каким-то образом SQL-инъекция могла бы справиться с этой предопределенной ошибкой, но я не вижу никакого способа, которым это могло бы произойти. Например, воткнуть это в начале соответствующего блока кода:

raiserror ('syntax checking, disregard error', 20, 1) with log

Итак, это ошибки из синтаксической ошибки:

raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1()
go
create table t2()
go

Пока эта ошибка выходит из ошибки времени выполнения (а t1 / t2 не создаются)

raiserror ('syntax checking, disregard error', 20, 1) with log
create table t1(i int)
go
create table t2( i int)
go

И чтобы округлить ваши параметры, вы можете сослаться на сборку C: \ Program Files \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ Microsoft.SqlServer.SqlParser.dll в утилите clr (вне из БД) и делать, как:

SqlScript script = Parser.Parse(@"create proc sp1 as select 'abc' as abc1");
0 голосов
/ 05 июня 2009

В SQL Server нет механизма для этого. Возможно, вы сможете сделать это с компонентом CLR и SMO, но для сомнительной выгоды это кажется большой работой.

Как насчет упаковки сценария в блок try / catch и выполнения кода "if fails" в блоке catch?

0 голосов
/ 05 июня 2009

Потенциально очень опасно. Гугл до "SQL инъекция" и посмотри на себя.

0 голосов
/ 05 июня 2009

Вы можете вызвать exec (), передавая скрипт как строку, и обернуть его в Try / Catch

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...