您當然可以限制查詢結果。我使用一個存儲過程,看起來像這樣做是爲了StackQL:
CREATE PROCEDURE [dbo].[WebQuery]
@QueryText nvarchar(1000)
AS
BEGIN
INSERT INTO QueryLogs(QueryText)
VALUES(@QueryText)
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET QUERY_GOVERNOR_COST_LIMIT 15000
SET ROWCOUNT 500
Begin Try
exec (@QueryText)
End Try
Begin Catch
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_MESSAGE() AS ErrorMessage,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_LINE() AS ErrorLine,
ERROR_STATE() AS ErrorState
End Catch
END
這裏最重要的部分是該系列的日誌經過三次SET
語句。這限制了結果中的行數和查詢的預期成本。 rowcount和query governor值可以是使用變量,所以不應該很難修改,以便根據當前用戶更改限制。
但是,您還應該注意,對於「知道」的用戶來說,如果他們想要的話就很容易被淘汰。在我的情況下,我認爲有能力不時超越限制的功能。但這也是我爲什麼要進行日誌記錄的原因:超越限制的代碼在日誌中突出顯示,因此我可以在未經我許可的情況下輕鬆捕捉並禁止任何人執行此操作。
最後,調用此任何用戶應該只在的denydatawriters作用下,的DataReader角色,然後給予明確的權限只執行該存儲過程。然後他們不能真的什麼但選擇現有的表。
現在,我預計您的下一個問題是您是否可以從報告生成器或管理工作室等某個位置進行自動配置。 Unfortunatley,我不認爲這是可能的。您需要爲他們提供某種界面,以便於調用存儲過程。但我可能在這裏錯了。
@Joel:所以不是讓用戶直接對數據庫運行查詢*,我可以讓他們使用這個薄包裝?我喜歡它,謝謝!是的,你釘了我的下一個問題。 – 2009-10-01 16:29:39