2011-08-05 57 views
2

在SQL Server Management Studio中,我反覆設法對主數據庫運行sql腳本,而不是我想要的特定數據庫。我打開一個SQL文件,然後單擊運行,反覆忘記先設置數據庫。在運行SQL之前檢查數據庫名稱

我知道你可以設置一個服務器連接的默認 - 但後來我可能最終默認的數據庫上運行的SQL,而不是我的目的之一,如果我打算一個是不是默認。

在SQL中使用語句將不會工作,要麼 - 腳本必須針對多個不同的測試數據庫運行。

所以反正是有標誌的警告腳本即將對主數據庫運行?或者可能在腳本運行之前先強制選擇數據庫?

回答

10

一種方式是與只有在所需的數據庫權限的帳戶連接。不是系統管理員,這是你現在正在做的。

如果你想爲系統管理員運行,該行添加到每個腳本

IF DB_NAME() = 'master' 
    RAISERROR ('Oi! Stop!', 20, 1) WITH LOG 
GO 

這將殺死連接

編輯這是正常的開發

我喜歡Quassnoi的解決方案,因爲它不需要系統管理員權限。 但是,您無法提供反饋或回覆。

所以,我一直在玩這個。它檢查最箱

  • 有趣的消息
  • 沒有系統管理員需要
  • 重新運行的(種)

有一個問題,一個SSMS USE(通過下拉)被忽略(按照Quassnoi的筆記),但它已經到了。任何人有更多的想法?

SET NOEXEC OFF; 
GO 
DECLARE @isOK bit; 
BEGIN TRY 
    IF DB_NAME() IN ('master', 'protectedDB1', '...') 
     RAISERROR ('To Catch Block Only', 16, 1); 
    SET @isOK = 1; 
END TRY 
BEGIN CATCH 
    SET @isOK = 0; 
    RAISERROR ('Oi! Stop!', 16, 1); 
END CATCH 
IF @isOK = 0 
    SET NOEXEC ON; 
GO 
SELECT 1; 
GO 
+1

+1:暴力,但有趣的解決方案! – Tao

+0

+1,我見過的最佳錯誤訊息! ''喂!停止!'' –

+0

+1但這是作弊:你不能提供一個有趣的信息給'SET NOEXEC ON'! – Quassnoi

7
IF DB_NAME() = 'master' 
     SET NOEXEC ON 
GO 
SELECT 1 
GO 

SET NOEXEC將使腳本中其餘的語句編譯但未執行。

你將不得不發行SET NOEXEC OFF,你將能夠在這方面進行任何東西(甚至選擇下拉框中的數據庫)之前。

或者只是關閉並重新打開腳本文件,它會關閉並重新打開連接。

+1

您的意思是「您將不得不發出'SET NOEXEC OFF'」...? –

相關問題