2009-10-01 54 views
1

我有一堆用戶在運行SQL Server的數據庫中進行臨時查詢。偶爾有人會運行一個查詢,鎖定系統很長一段時間,因爲他們檢索10MM行。我可以在SQL Server中強制用戶進行某些設置嗎?

是否可以在特定登錄連接時設置某些選項?例如: -

  • 事務隔離級別
  • 最大行數
  • 查詢超時

如果這不是在SQL Server 2000中可能的,是有可能在另一個版本?據我所知,資源調控器不會給你這樣的控制(它只是讓你管理內存和CPU)。

我意識到用戶可以自己做很多事情,但如果我可以從每個用戶的服務器控制它,那將是非常棒的。

顯然我想將用戶從直接表/視圖訪問中移走,但目前這不是一種選擇。

回答

2

您當然可以限制查詢結果。我使用一個存儲過程,看起來像這樣做是爲了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,我不認爲這是可能的。您需要爲他們提供某種界面,以便於調用存儲過程。但我可能在這裏錯了。

+0

@Joel:所以不是讓用戶直接對數據庫運行查詢*,我可以讓他們使用這個薄包裝?我喜歡它,謝謝!是的,你釘了我的下一個問題。 – 2009-10-01 16:29:39

2

在SQL Server 2005和2008中,您可以將數據庫中的LOGIN觸發器添加到可能更改連接設置的數據庫中,這取決於他們以誰的身份連接。但是,您需要謹慎對待這些,因爲觸發器中的錯誤或錯誤可能導致每個人都被鎖定。

在SQL Server 2000中沒有這樣的東西。


我只是想補充的是,如果喬爾的方法也適用於你,那麼我強烈鼓勵過我的這個方法,因爲登錄觸發器是一個在這個問題被拋威武大和危險的手榴彈。

如果你仍然真的想這樣做,here是一個不錯的文章,演示如何使用它們。然而,更重要的是,here有關於如果您的登錄觸發器鎖定每個人都應該採取的關鍵指示。

+0

+1謝謝你,它看起來很有希望。不過,它會從一個例子中受益。 – 2009-10-01 21:43:47

+0

非常有用,謝謝! – 2009-10-02 20:10:53

相關問題