sp_executesql 不验证查询字符串
sp_executesql does not validate the query string
今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不更改它,使用内联查询,
执行此查询一切顺利:
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
,table不存在但是EXEC sp_executesql @script ;
执行没有任何错误。
当我尝试使用这个存储过程时,出现错误:
Msg 208, Level 16, State 1, Procedure GetALL, Line 5
Invalid object name 'dbo.alabla'.
有人能告诉我们如何确保内联查询执行安全吗?
看这里:How to precompile stored procedures in SQL server?
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。您上面的示例非常适合内联 (single-statement, ad-hoc) TVF...
今天我遇到了最糟糕的情况。数据库中有一个存储过程,我不得不更改它,使用内联查询,
执行此查询一切顺利:
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
,table不存在但是EXEC sp_executesql @script ;
执行没有任何错误。
当我尝试使用这个存储过程时,出现错误:
Msg 208, Level 16, State 1, Procedure GetALL, Line 5
Invalid object name 'dbo.alabla'.
有人能告诉我们如何确保内联查询执行安全吗?
看这里:How to precompile stored procedures in SQL server?
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。您上面的示例非常适合内联 (single-statement, ad-hoc) TVF...