sp_executesql не проверяет строку запроса
Сегодня я столкнулся с худшей ситуацией. В базе данных есть хранимая процедура, мне пришлось ее изменить, используя встроенный запрос,
Все прошло хорошо, выполнив этот запрос:
DECLARE @script AS NVARCHAR(MAX)
SET @script = 'ALTER PROCEDURE GetALL
with recompile
AS
BEGIN
SELECT *
FROM dbo.Main
INNER JOIN dbo.alabla ON dbo.Main.ID = dbo.ATTENDANCE.EMPLOYEE_ID
END'
EXEC sp_executesql @script ;
Выше запрос имеет синтаксическую ошибку alabla
, таблица не существует, но EXEC sp_executesql @script ;
выполняется без каких-либо ошибок.
и когда я пытался использовать эту хранимую процедуру, я получаю сообщение об ошибке:
Сообщение 208, Уровень 16, Состояние 1, Процедура GetALL, Строка 5
Неверное имя объекта 'dbo.alabla'.
Кто-нибудь может сказать здесь, как мы можем гарантировать, что выполнение встроенного запроса безопасно?
1 ответ
Посмотрите здесь: Как прекомпилировать хранимые процедуры на сервере SQL?
sp_recompile
пометит только метод, который будет перекомпилирован при следующем вызове...
Если ваша вновь созданная процедура не манипулирует данными (ваш пример выше), вы можете просто вызвать ее немедленно...
Лучшая подсказка может быть, чтобы посмотреть на SET FMTONLY
даже если это устарело ( https://msdn.microsoft.com/de-de/library/ms173839(v=sql.120).aspx) или вы можете использовать sp_describe_first_result_set
(и связанные: смотрите ссылки на упомянутой странице).
Это должно заставить немедленную компиляцию...
Кроме того, посмотрите на
- DBCC CHECKDB
- DBCC FREEPROCCACHE
- DBCC PROCCACHE
Кстати: я бы не использовал SP, если вы хотите только читать данные. Ваш пример выше был бы идеальным кандидатом для встроенного (одиночного, специального) TVF...