在运行时切换数据库上下文

时间:2014-06-19 22:58:47

标签: sql-server

我使用下面的代码将db上下文切换为master并创建过程和安装启动脚本。

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 个答案:

答案 0 :(得分:1)

取代主数据库的USE语句,限定目录视图并使用EXEC sp_executesql语句和master数据库限定。这将避免在外部脚本中更改数据库上下文。

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