簡體   English   中英

用於參數化動態表的SQL查詢

[英]SQL Query for paramaterized dynamic table

我管理的產品團隊之一擁有大量使用動態sql查詢的查詢,這些查詢使用串聯將表注入。 盡管具有衛生功能,但我正在嘗試完全刪除動態sql。

有沒有一種方法可以參數化表名? 我正在嘗試思考如何查詢類似表的內容:

SELECT * FROM (SELECT DISTINCT Table_Name FROM INFORMATION_SCHEMA.Tables WHERE Table_Name = :queryParam)

這可能嗎?

我正在嘗試完全刪除動態sql。

  • 沒有Dynamic SQL您將無法做到。

這可能嗎?

  • 不,不可能,您無法在SQL查詢中參數化標識符。

為什么?

  • 在“ 變量 ”的在線圖書頁面上, Variables只能在表達式中使用,而不能代替object nameskeywords 要構造dynamic SQL語句,請使用EXECUTE

這是唯一的方法:

DECLARE @Column SysName = N'Table_Name',
        @Param NVARCHAR(128) = N'ParamValue';

DECLARE @SQL NVARCHAR(MAX)=N'SELECT *
                             FROM(
                                   SELECT '+ QUOTENAME(@Column) +
                                   'FROM INFORMATION_SCHEMA.Tables
                                    WHERE ' + QUOTENAME(@Column) + ' = @Param
                                 ) T';
EXECUTE sp_executesql @SQl,
                      N'@Param NVARCHAR(128)',
                      @Param;

無法“適當地”完全阻止SQL內的SQL注入,調用應用程序層應在執行任何SQL語句之前執行此操作。

在應用程序代碼中生成SQL時,可以通過使用ORM或構建代碼來保護自己免受SQL注入,從而解決該問題。

這感覺就像是經典的XY問題,請后退一步,並認為您需要保護對SQL Server本身的訪問,而不是在“訪問” SQL Server之后清除所有內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM