2013-04-18 65 views
-1

需求:
我有一個SSIS項目將運行SQL Server中的數據,可能使用集成身份驗證登錄到SQL Server。 該項目包含一個部分,允許最終用戶將選擇查詢添加爲一個數據流的源。 (該產品允許用戶在配置文件中添加數據分類和過濾類型規則)。
我希望用戶提供的查詢在只讀訪問的限制環境中運行。對於某人通過在他們的查詢中添加DELETEDROP來垃圾數據庫一定是不可能的。在SSIS數據源中切換上下文

首過解決方案:
在數據庫上創建一個只讀用戶,並使用EXECUTE AS ... WITH NO REVERT將查詢的上下文限制爲只讀用戶。不幸的是,這並沒有完全奏效。 SSIS在數據源組件中使用預準備語句,並且SQL Server在預準備語句中不允許​​。

問題:
有沒有辦法強制SSIS使用ad-hoc查詢來代替OLEDB數據源組件中的預處理語句?
或...是否有另一種方法來強制SSIS更改數據源組件的執行上下文?

我還有一個解決方案:使用腳本組件源。腳本組件可以通過許多方式設置用戶上下文。

回答

0

我最終解決這個問題的方法是讓腳本源組件包裝用戶提供的SELECTEXECUTE AS user WITH NO REVERT。我確信使用權限結構來防止未完成的操作比使用事務更好。

我創建了兩個連接管理器。一個(稱爲connection_RO)是一個ADO.NET連接管理器,它只被執行用戶提供的查詢的組件使用。另一個(connection_RW)用於其他任何事情,包括轉換用戶提供的查詢中的數據並將其寫回。

有一個腳本源組件執行用戶提供的查詢。它使用EXECUTE AS ...子句將查詢前綴鎖定到只讀上下文中。

接下來要解決的問題是,所有連接都默認爲合併,並且當您選取以前在池中使用的連接時,框架會發送一個sp_reset_connection。這引發了一個異常,因爲SQL Server認爲它是試圖提升權限。因此connection_RO連接管理器必須配置爲沒有池。

最終的結果是,我可以放心地運行用戶提供的查詢,使用戶無論是惡意還是意外都不會造成任何損害。

0

您可以使用OLEDB sourcead-hoc查詢使用SQL Command from Variable選項。你可以在你的SQL查詢創建一個變量和類型,並在OLEDB源組件。使用XML配置使用它和變量添加到it.So如果你改變XML中的query將在runtime期間反映在SSIS中。然而SSIS在很大程度上依賴於執行前Metadata。甚至,SSIS驗證的元數據。如果你改變XML查詢(如更改列名稱),然後SSIS將發現的元數據不匹配,幷包將fail

+0

我已經在使用來自變量的SQL命令來獲取用戶提供的查詢到數據源中。問題在於SSIS自動將其包裝在sp_prepare中,並且在這種情況下,SQL Server將不接受'WITH NO REVERT'。只要我不能使用'WITH NO REVERT',智能用戶就可以通過在他們的查詢中加入'REVERT'來打破只讀環境。我需要解決的問題是強制用戶留在只讀上下文中。這可能是通過阻止SSIS使用'sp_prepare'(即:使用臨時的,未準備好的語句)。 –

1

有stackoverflow上的一些答案建議將其包裝在BEGIN TRAN/ROLLBACK TRAN中。這可能在單獨的SQL任務中,消除了通過偷偷注入來禁用它們的功能。但他們仍然可以將DROP DATABASE注入到數據流中。沒辦法回滾那個。

您是否檢查過DML是否運行在數據流的源代碼中?

我的確質疑這個架構雖然.....在SSIS中運行用戶定義的查詢?

+0

謝謝你。我已經檢查了「INSERT」和「DELETE」在上下文中的工作。我還沒有測試過很多其他的東西,但這足以令人擔憂。使用交易不是我考慮的選項,值得測試,所以非常感謝。我已經使用腳本組件源實現了一個測試,並且似乎按照需要工作,所以我可能只需要這樣做。至於在SSIS中運行用戶提供的查詢:有一個不可避免的要求來運行用戶提供的查詢,並且所有其他數據操作都在SSIS中... –