如何阻止用户访问以执行数据库应用程序更新?

Bao*_*dad 7 sql-server access-control sql-server-2008-r2

在我工作的地方,我们有一个 SQL Server 数据库(Microsoft SQL Server 2008 R2)作为后端,有两个不同的用户界面,一个 .NET Web 界面和一个 FoxPro 界面。

每个月我们都需要对 Web 和 FoxPro 客户端应用更新。在执行此操作之前,建议我们确保在更新过程中没有人访问数据库。

在我们更新数据库时阻止访问数据库的最简单方法是什么?后续问题:在我们更新时阻止访问的最佳方法是什么?

db2*_*db2 10

如果将数据库置于受限用户模式下,则只有固定服务器角色成员sysadmindbcreator固定数据库角色,或者成员db_owner可以访问数据库:

ALTER DATABASE my_app_db SET RESTRICTED_USER
Run Code Online (Sandbox Code Playgroud)

如果要强制关闭现有连接:

ALTER DATABASE my_app_db SET RESTRICTED_USER WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)

当您准备好让一切恢复正常时:

ALTER DATABASE my_app_db SET MULTI_USER
Run Code Online (Sandbox Code Playgroud)

来源:http : //www.blackwasp.co.uk/SQLRestrictedUser.aspx

在这些情况下,我不建议使用单用户模式,因为应用程序更新过程可能需要同时打开多个连接。


Kin*_*hah 9

有几种方法可以限制对数据库的访问:

  1. 使用登录触发器 - 但只是暂时的(在升级前启用然后禁用它)。请参阅我的答案 在这里更多的细节,包括一个脚本。
  2. 您可以关闭 Web 服务器上的 IIS,这样就不会使用该应用程序建立连接。这称为“应用程序停机时间”
  3. 将数据库保持在单用户模式下使用(请注意,这将有风险,因为如果有任何其他连接到数据库,那么您最终可能会等待或拒绝连接。)

    alter database databasename
    set single_user with rollback immediately
    
    Run Code Online (Sandbox Code Playgroud)

在维护窗口期间,您最好使用选项 2 作为安全且有计划的升级。

编辑:

受限用户- 仅允许对数据库具有 dbo 权限的用户(例如 db_owner、dbcreator、sysadmin)。这意味着多个用户仍然可以登录到数据库,只要他们是 DBO。

单用户- 只允许一个连接,即先到先得。

由于单用户先到先得的事实 - 如果出现错误或以某种方式终止您的连接,这将更具风险。

在处理登录触发器时,正如@AaronBertrand 指出的那样,它不适用于现有会话,但您可以通过首先杀死所有会话然后启用触发器来克服这一点,以便所有新传入的连接都必须通过扳机。

我想不出任何其他方式来限制与数据库的连接。

  • 我认为登录触发器不一定是一个好方法 - 现有会话不必通过触发器,因此即使在您更改触发器以将人们拒之门外后,它们也可能会启动更多工作。 (2认同)