Различие ч / б конкатенации строк и переменных связывания в динамическом SQL - PullRequest
1 голос
/ 23 мая 2019

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

var_name := 'SKING';
sql := 'select * from emp where ename = ' || var_name;
execute immediate sql;

и переменные связывания

sql := 'select * from emp where ename = :1';
execute immediate sql
using var_name;

в динамическом SQL. Спасибо!

1 Ответ

6 голосов
/ 23 мая 2019

Потенциально огромная разница в поведении, если var_name содержит строку типа

'A' AND 1=2 UNION SELECT password, null, null ... FROM users WHERE username='admin'

. В первом примере вы можете просто манипулировать БД, чтобы сбросить пароль администратора (хэши) или другую конфиденциальную информацию.Если бы это было сделано как переменная связывания, вы бы получили 0 строк, если на самом деле нет сотрудника с именем 'A' AND 1=2 UNION ...

. Первый запрос даже вызовет сбой, если имя вашего сотрудника будет гораздо более безобидным.Peter O'Toole или что-то еще с допустимым символом

https://bobby -tables.com подробно расскажет о взломе SQL-инъекций

Всегда, всегда, всегда используйтесвязать переменные.Никогда не существует оправдания для конкатенации строк значения в запросе, когда вместо него можно объединить имя переменной вместо

-

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

SELECT * FROM emp WHERE emp_type = 'manager' and emp_name = :name

Выше оптимизатор может легко сделать вывод, что этот запрос будетвсегда только типы менеджера возврата, хотя имя может отличаться. Это может повлиять на стратегии доступа к данным и индексации и повлиять на производительность.Трудно быть конкретным, потому что оптимизатор - это что-то вроде черного ящика;но будьте уверены, что он стремится обеспечить наилучшую производительность из доступной информации благодаря старому доброму капитализму / рыночным силам (кто покупает медленный дБ?), так что помогите ему ..

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