Member 11589429 Ответов: 1

Как определить, что динамический SQL терпит неудачу?


Я создал один триггер, внутри которого выполняется динамический sql. Вот пример сценария

Когда я указываю @Text на какое-то значение,оно работает (после того, как exec показывает 1 строку affected), но когда я указываю null, запись не добавляется в таблицу(сообщение: запрос выполнен успешно).Я хочу, как и его, если запись не будет добавлена в таблицу образцов, пожалуйста, добавьте в Образец 2 без динамической вставки.Как узнать динамический exec успешно или нет.Я не хочу получать последнюю идентичность таблицы.Как это сделать?

declare @Inserttbl nvarchar(4000) declare @TableName varchar(50) declare @Text varchar(50) declare @count int set @TableName ='sample' set @Text = null

set @Inserttbl = ' Insert into Test.dbo.' +@TableName +' values (3,'+@Text+',1)' exec sp_executesql @Inserttbl


Что я уже пробовал:

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

1 Ответов

Рейтинг:
0

OriginalGriff

Я бы настоятельно рекомендовал вам отказаться от этого подхода: он оставляет вас широко открытыми для атак SQL-инъекций, которые могут повредить или уничтожить вашу БД, в зависимости от того, что передается вашему SP.
Кроме того, я бы посоветовал вам изменить это, чтобы перечислить столбцы, в которые вы вставляете: если вы используете поля идентификаторов, то они, скорее всего, будут находиться в начале списка столбцов, и если вы не назовете столбцы, SQL будет вставлять их в строки в текущем порядке столбцов. Если первая строка-IDENTITY, SQL всегда будет терпеть неудачу.


Member 11589429

Я изменил свой код.
объявить @Inserttbl nvarchar(4000)
объявить @TableName varchar(50)
объявить @PId int
объявить @Text varchar(50)
объявить @count int
объявить @Status int
set @TableName = 'sample'
set @Text = null
set @PId = 3
set @Status =1

набор @Inserttbl = ' вставить в тест.ДБО'.Значения +@имятаблицы + ' ('+пид@+','+@текст+','+@статус+')'
exec sp_executesql @Inserttbl

Еще SQL-инъекции будет?

OriginalGriff

Да.
Когда вы объединяете строки, вы передаете текст в SQL как часть команды:
Вставить в Customers (MyColumn) значения ('все, что набрал пользователь')
Поэтому, если пользователь набирает "значение для вставки", все в порядке:
Вставить в клиентов (столбец mycolumn компонент компонент) значения ('значение, чтобы вставить')
Если пользователь вводит "X"); DROP TABLE Customers;--"
Тогда что же выполняет SQL:
Вставить в клиентов (столбец mycolumn компонент компонент) значения ('х';откидной столик клиентами;--')
Который выглядит для SQL как три отдельные команды:
Вставить в клиентов (столбец mycolumn компонент компонент) значения ('х';
Удаление таблицы клиенты;
--')
Таким образом, SQL делает вставку, отбрасывает таблицу и игнорирует комментарий. Попробуйте: создайте резервную копию своей базы данных и дайте ей шанс...
И если у вас есть веб-интерфейс ,они могут сделать это из любого места...

Member 9831003

вы можете попробовать приведенный ниже код.

Объявить @Inserttbl nvarchar(4000)
Объявить @TableName varchar(50)
Объявить @Text varchar(50)
-- Объявить @count int
Набор тест @Имятаблицы =''
SET @Text = NULL

если (@Text не является нулевым)
начать
SET @Inserttbl = 'Insert into dbo.' + @TableName + 'values (3,' +""+@Text+""+', 1)'

Exec для процедуры sp_executesql @Inserttbl
конец
ещё
начать
Нулевое значение печати не вставлена'
конец

И да, есть возможность SQL-инъекции даже под sp_executesql. Проверьте ссылку ниже также для проверки Вашего параметра
https://msdn.microsoft.com/en-us/library/ms161953(в SQL.105).aspx-файл