管理与 SQL Server 中企业级地理数据库的连接

在 Standard 或 Advanced 许可等级下可用。

作为地理数据库管理员,可能偶尔需要识别哪些用户连接到了地理数据库以及哪些连接锁定了资源。 如果用户无法自行断开连接,则可能还需要移除某些连接。 例如,一位编辑者可能在编辑时使 ArcGIS Pro 处于打开状态,将数据锁定在编辑会话中,导致其他编辑者无法访问数据,数据所有者无法更改表的方案。 或者,您可能需要所有人断开连接,以便对数据库应用修补程序、恢复数据库或压缩地理数据库。

您可通过 ArcGIS Pro 以数据库管理员的身份连接到地理数据库,以便查看连接并在必要时将其删除。 或者您可以使用 ArcPy 函数完成相同的工作流。

要从 Microsoft SQL Server 中的企业级地理数据库断开用户连接,地理数据库管理员可能需要附加权限。

  • sde 方案地理数据库 (sde) 中的地理数据库管理员需要对数据库具有 VIEW DEFINITION 权限才能查看已连接用户的列表,并且必须是 processadmin 固定服务器角色的成员才能断开与用户的连接。
  • 如果 dbo 方案地理数据库的地理数据库管理员是数据库所有者,必须将地理数据库管理员添加到 processadmin 固定服务器角色才能断开用户连接。
如果地理数据库管理员是 sysadmin 固定服务器角色的成员,则 dbo 方案地理数据库的地理数据库管理员不需要任何附加权限。

警告:

在断开用户连接时请谨慎操作。 避免断开活动会话,特别是已连接用户正在进行编辑时。 只有处于打开状态但当前未使用的会话(例如,某个会话整个周末都处于打开状态)、正在锁定某个对象的孤立会话或者处于死锁情况的会话可以断开连接。

首先确定哪些用户连接到了地理数据库。 然后根据需要移除连接。

识别并移除 ArcGIS Pro 中的连接

您可以在 ArcGIS Pro 中以地理数据库管理员的身份连接至地理数据库,以通过地理数据库管理对话框查看连接。

  1. 启动 ArcGIS Pro
  2. 以地理数据库管理员身份连接到地理数据库
  3. 右键单击数据库连接,然后单击 管理 > 连接

    将显示当前连接到地理数据库的所有会话的列表。 您的会话以斜体文本显示。

  4. 请联系各个用户并要求其关闭其对话。 如果您无法联系到用户且仍需要断开他们与地理数据库的连接,则可继续执行下一步骤。
  5. 右键单击要从地理数据库移除的指定会话,然后单击断开连接

    该会话将立即与地理数据库断开连接。

  6. 关闭地理数据库管理 对话框。

使用 Python 识别并移除连接

您可以运行 ArcPy 函数,为地理数据库管理员用户创建地理数据库连接文件,使用该连接文件连接到地理数据库,然后获取当前所有地理数据库连接的列表,并根据需要从地理数据库移除连接。

  1. 通过在 Python 窗口中运行 CreateDatabaseConnection_management 函数来创建数据库连接。

    在本例中,将在临时文件夹中创建连接文件 (ssgdb.sde)。 此连接是通过 sa 身份登录对 sdept4 SQL Server 实例中的 gisprod 数据库建立的。

    import arcpy
    arcpy.CreateDatabaseConnection_management ("c:\\temp","ssgdb.sde","SQL_SERVER","sdept4","DATABASE_AUTH","sa","esayP@ss","SAVE_USERNAME","gisprod")

  2. 运行 ListUsers 函数以获取当前到 gisprod 数据库的所有连接的列表。

    提供在上一步中创建的连接文件。

    ##No need to import arcpy if you are running functions in the same Python window.
    import arcpy
    
    arcpy.ListUsers("c:\\temp\ssgdb.sde")

    将返回用户连接列表。

    [user(ClientName=u'PC4', ConnectionTime=datetime.datetime(2018, 10, 18, 8, 30, 19),
     ID=18, IsDirecConnection=True, Name=u'PUBLISHER1')]
    [user(ClientName=u'PC25', ConnectionTime=datetime.datetime(2018, 10, 21, 14, 10, 43),
     ID=33, IsDirecConnection=True, Name=u'EDITOR2')]
    [user(ClientName=u'PC11', ConnectionTime=datetime.datetime(2018, 10, 22, 9, 18, 26),
     ID=39, IsDirecConnection=True, Name=u'READER5')]
    [user(ClientName=u'PCA2', ConnectionTime=datetime.datetime(2018, 10, 22, 11, 21, 2),
     ID=41, IsDirecConnection=True, Name=u'DBO')]

  3. 请联系各个用户并要求其关闭其对话。 如果您无法联系到用户且仍需要断开他们与地理数据库的连接,则可继续执行下一步骤。
  4. 使用通过 ListUsers 函数获取的信息来识别将使用 DisconnectUser 函数移除的连接。

    指定要移除的连接 ID。 在这里,ID 为 33 的连接被删除:

    ##No need to import arcpy if you are running functions in the same Python window.
    import arcpy
    
    arcpy.DisconnectUser("c:\\temp\ssgdb.sde",33)

    该会话将立即与地理数据库断开连接。