2014-06-19 76 views
0

我正在使用下面的代碼將db上下文切換爲主並創建過程並設置啓動腳本。在運行時切換數據庫上下文

BEGIN TRY 
DECLARE @dbName NVARCHAR(100) 
SET @dbName = DB_NAME() 
USE MASTER 
IF NOT EXISTS (
      SELECT name 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID('spSetTrustWorthyOn') 
      ) 
     EXEC (
       'CREATE PROCEDURE spSetTrustWorthyOn 
     AS 
     BEGIN 
      ALTER DATABASE [' + @dbName + '] SET TRUSTWORTHY ON 
     END' 
       ) 

    EXECUTE sp_procoption 'spSetTrustWorthyOn' 
     ,'startup' 
     ,'ON' 
    END TRY 
    BEGIN CATCH 
    END CATCH 
    GO 

現在問題是當我想切換回現有的數據庫。我找不到任何方式回到我原來的數據庫。

我也不能硬編碼數據庫,因爲這是動態查詢,我們有多個數據庫。

任何幫助將不勝感激。

感謝

回答

1

代替主數據庫USE語句的,有資格的目錄視圖,並使用EXEC sp_executesql的語句與限定主數據庫。這將避免更改外部腳本中的數據庫上下文。

DECLARE 
    @dbName sysname = DB_NAME() 
    ,@sql nvarchar(MAX); 

BEGIN TRY 

    IF NOT EXISTS (
     SELECT * 
     FROM master.sys.objects 
     WHERE object_id = OBJECT_ID(N'spSetTrustWorthyOn') 
     ) 
    BEGIN 
     SET @sql = N'CREATE PROCEDURE spSetTrustWorthyOn 
      AS 
      BEGIN 
       ALTER DATABASE ' + QUOTENAME(@dbName) + ' SET TRUSTWORTHY ON; 
      END;'; 
     EXECUTE master..sp_executesql @sql; 
     EXECUTE sp_procoption 
      'spSetTrustWorthyOn' 
      ,'startup' 
      ,'ON'; 
    END; 
END TRY 
BEGIN CATCH 
    THROW; 
END CATCH; 
GO 
+0

感謝您的回覆,但商店proc應該是主數據庫的一部分。 –

+0

你試過這個腳本嗎?由於「EXECUTE master..sp_executesql」語句中的顯式數據庫限定,它將在master中創建存儲過程。執行後數據庫上下文將保留在用戶數據庫中。 –

+0

很酷,我沒有看到'EXECUTE master..sp_executesql'這一行。感謝TON,因爲我一直在努力完成這項工作。我使用了sp_execute sql這個想法,但我很笨,以至於我可以這樣調用。 –

相關問題