我有一组仅在特定时间更新的维度。
我已将这些表移动到名为Dimensions
. 我想将此文件组保持为只读。当 ETL 运行时,它将文件组设置为读写,运行,然后将其设置回只读。
但是当我运行时ALTER DATABASE MYDB MODIFY FILEGROUP Dimensions READ_ONLY
,我收到消息Database state cannot be changed while other users are using the database 'MYDB'
。
避免新事务、等待当前事务完成然后运行此命令的侵入性最小的方法是什么?有没有办法让数据库成为单用户一段时间,或者让它离线,无论如何?
更新:我基于文章The Read Uncommitted Isolation Level:
对于需要最高级别一致性保证的场景,可序列化仍然是唯一安全的选择。对于只读数据的性能关键型操作(例如,在 ETL 窗口之间实际上是只读的大型数据库),显式地将数据库设置为 READ_ONLY 也是一个不错的选择(当数据库被访问时不使用共享锁)只读,并且没有不一致的风险)。
通常人们只想立即将所有用户踢出,所以他们使用:
在您的情况下,如果您希望所有现有活动继续进行直到轮到您,这将无限期地等待:
如果你想给一些时间但不想永远等下去,你可以这样说:
这将等待 5 分钟,然后回滚所有剩余的事务。
RESTRICTED_USER
也可能是您的一个选择,以防SINGLE_USER
代理或其他后台线程占用您的连接。我不知道有什么方法可以设置数据库的状态,以便允许现有事务完成并且没有新连接(或来自现有连接的新事务)是可能的。
这里的一些信息: