我使用下面的代码将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
现在问题是当我想切换回现有数据库时。我找不到任何方法返回原始数据库。
我也不能对数据库进行硬编码,因为这是动态查询,我们有多个数据库。
非常感谢任何帮助。
由于
答案 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