您可以暂时关闭 Microsoft SQL Server 中的数据库更改吗?

Nog*_*ggy 5 sql-server

在即将到来的更新中,我需要将我们服务器中的多个表从 UTF-16 转换为 UTF-8。我预计这将需要几个小时。

有没有关闭 INSERTS 和 UPDATES,但仍然允许数据库中的 SELECTS 的好方法?

或者我是否需要在更新发生时阻止业务级别的更改/关闭数据库?

Ben*_*hul 17

您可能有XY 问题。有一些方法可以执行您正在尝试的操作,而无需在操作期间对正在操作的表不可用。这是我如何摆动它(高水平):

  1. 添加具有所需定义(数据类型、排序规则等)的新列。
  2. 使用“插入后”触发器来确保来自您的应用程序的数据更改也会更改新列。
  3. 回填表中的现有数据。
  4. 删除旧列,重命名新列以使用旧列的名称。

  • XY 问题。哦,上帝,那太美了。我差点哭了......;) (3认同)

Dou*_*oug 7

如果没有进一步了解您的数据库架构、权限等以及您对应用程序的策略的一些想法,就很难做出规定。至少,该应用程序是否甚至允许您在表更新被阻止的情况下以只读模式运行?

在一个非常基本的层面上,“是”你可以这样做...... DENY INSERT, UPDATE, DELETE ON <table> TO <user> 但是不可能说你的应用程序将如何反应。根据我的经验,如果您这样做,大多数应用程序都会到处乱写错误并发出血腥的谋杀,甚至可能损坏数据(未经检查的错误,事务使用不当等)。我很少(可能从来没有)看到一个应用程序在数据库访问不符合设计/预期时优雅地切换到只读模式。

所以测试!在受控的非生产环境中进行测试、测试、测试,直到您拥有支持变更的文档化流程。

如果您的要求不允许长时间停机(或根本不停机),则有更复杂的方法来处理此问题。一种想法是添加一个 after insert / after update 触发器,以在您对较小批次运行维护时自动转换新字段中的新 / 更新记录。转换完所有数据后,将应用程序切换到新字段并删除旧字段。