Sql 如何返回到多用户模式
我的问题是:Sql 如何返回到多用户模式,sql,sql-server,tsql,multi-user,single-user,Sql,Sql Server,Tsql,Multi User,Single User,我的问题是: IF EXISTS(%some query%) BEGIN BEGIN TRY ALTER DATABASE [MyDatabase] SET single_user WITH ROLLBACK IMMEDIATE; --do something --throw some exception END TRY BEGIN CATCH --here I want to set
IF EXISTS(%some query%)
BEGIN
BEGIN TRY
ALTER DATABASE [MyDatabase] SET single_user WITH ROLLBACK IMMEDIATE;
--do something
--throw some exception
END TRY
BEGIN CATCH
--here I want to set database back to multi_user
RAISERROR ('DBErrorMessage', @ErrorSeverity, @ErrorState);
END CATCH
END
将数据库设置回多用户的最佳方法是什么?我担心最直接的方法可能会导致
数据库“MyDatabase”已打开,一次只能有一个用户
例外
我最直截了当的意思是:
ALTER DATABASE [MyDatabase] SET MULTI_USER
“当前用户当前已连接到它”可能是SQL SERVER MANAGEMENT STUDIO窗口本身
选择masterdatabase,然后运行
ALTER DATABASE TherapyDatabaseWTS
SET MULTI_USER;
GO
或者,如果您想使用SQLServerManagementStudio,请按照
Right click Database >> Properties >> Options >> State >> RestrictAccess
>> Choose Multi_user and click OK
“当前用户当前已连接到它”可能是SQL SERVER MANAGEMENT STUDIO窗口本身
选择masterdatabase,然后运行
ALTER DATABASE TherapyDatabaseWTS
SET MULTI_USER;
GO
或者,如果您想使用SQLServerManagementStudio,请按照
Right click Database >> Properties >> Options >> State >> RestrictAccess
>> Choose Multi_user and click OK
如果你简单地说
ALTER DATABASE [MyDatabase] SET MULTI_USER
接球后?它不应该找到任何活动用户,因为您是程序/存储过程中的单个用户
另外,您是否尝试过在CATCH块中使用ROLLBACK将所有内容都放在事务中?如果简单地将
ALTER DATABASE [MyDatabase] SET MULTI_USER
接球后?它不应该找到任何活动用户,因为您是程序/存储过程中的单个用户
另外,您是否尝试过在CATCH块中使用ROLLBACK将所有内容放入事务中?我刚刚做了一个快速测试:
BEGIN TRY
ALTER DATABASE DB1 SET SINGLE_USER
SELECT 1/0 --it generates an error
END TRY
BEGIN CATCH
ALTER DATABASE DB1 SET MULTI_USER
END CATCH
它似乎正在工作,批处理完成后,DB1仍处于多用户模式…我刚刚做了一个快速测试:
BEGIN TRY
ALTER DATABASE DB1 SET SINGLE_USER
SELECT 1/0 --it generates an error
END TRY
BEGIN CATCH
ALTER DATABASE DB1 SET MULTI_USER
END CATCH
它似乎正在工作,在批处理完成后,DB1仍然处于多用户模式…已经有一段时间了,但我相信带有立即回滚的
选项可以告诉您,无论发生什么情况,您都希望此操作成功。正常行为会一直阻塞,直到所有正在运行的事务成功完成
另外,当数据库已经是多用户模式时,将其设置为多用户模式是安全的
但是,如果您想真正确定,请使用嵌套的try-catch块。第一个用于处理移动到单用户模式的任何错误,而内部一个用于处理在单用户模式下发生的错误
看
及
关于完整性的最后几点注意事项:
1) 如果错误严重,您的连接将被关闭,数据库仍将处于单用户模式
2) 您应该有一个测试实例,在那里您可以安全地尝试这些东西,这样您就可以了解生产中将要发生的事情。已经有一段时间了,但我相信带有立即回滚的选项可以告诉您,无论发生什么情况,您都希望它成功。正常行为会一直阻塞,直到所有正在运行的事务成功完成
另外,当数据库已经是多用户模式时,将其设置为多用户模式是安全的
但是,如果您想真正确定,请使用嵌套的try-catch块。第一个用于处理移动到单用户模式的任何错误,而内部一个用于处理在单用户模式下发生的错误
看
及
关于完整性的最后几点注意事项:
1) 如果错误严重,您的连接将被关闭,数据库仍将处于单用户模式
2) 您应该有一个测试实例,在那里您可以安全地尝试这些东西,这样您就可以了解生产中将要发生的事情。有时可能是这样,但是如果我想从我的程序中这样做呢?我的问题是,当设置单用户失败并引发异常时,数据库已经处于多用户状态,为什么要设置这是一个卸载场景。我想将[MyDatabase]
设置为单用户
,然后删除数据库。如果在删除过程中出现异常,我想将其设置回multi_user
。这就是我的观点,首先DB是多用户的,然后您尝试设置为单用户,但失败了,所以DB会自动在多用户状态下重新生成?不是真的。它成功地设置为单用户,然后我尝试删除db,但失败了,db保持在单用户模式。有时可能是这样,但如果我想从我的程序中执行此操作,该怎么办?我的问题是,当设置单用户失败并引发异常时,数据库已经处于多用户状态,为什么要设置这是一个卸载场景。我想将[MyDatabase]
设置为单用户
,然后删除数据库。如果在删除过程中出现异常,我想将其设置回multi_user
。这就是我的观点,首先DB是多用户的,然后您尝试设置为单用户,但失败了,所以DB会自动在多用户状态下重新生成?不是真的。成功设置为单用户,然后我尝试删除db,但失败,db保持单用户模式。是否保证我的用户会使用db?如果可以保证,那么这个变体完全适合我。我认为在ms sql中禁止在事务内部使用ALTER DATABASE
。如果可以将其设置为多用户,那么当前登录的用户应该是数据库中的唯一用户。可以保证数据库将由我的用户使用吗?如果可以保证,那么这个变体完全适合我。我认为在ms sql中禁止在事务内部使用ALTER DATABASE
。如果可以将其设置为多用户,那么当前登录的用户应该是数据库中的唯一用户。