在 ArcGIS for Desktop 中使用地理处理工具、Python 脚本或地理数据库管理工具执行您之前使用 ArcSDE 管理命令执行的地理数据库管理和数据管理。
以下部分列出如何完成企业级地理数据库的公共地理数据库管理和数据管理任务。
地理数据库管理
一些管理任务要求您以地理数据库管理员身份连接;一些要求您以数据库管理员的身份连接。在大多数情况下,如果要进行脚本管理任务,您将需要创建以规定用户身份连接的数据库连接文件 (.sde)。使用创建数据库连接地理处理工具或 ArcGIS for Desktop 中的数据库连接对话框创建该文件。
| 创建地理数据库 | 工具 | 
|---|---|
在 Microsoft SQL Server、Oracle 或 PostgreSQL 中创建地理数据库  | 创建企业级地理数据库地理处理工具或启用企业级地理数据库地理处理工具  | 
在 IBM DB2 或 IBM Informix 中创建地理数据库  | 启用企业级地理数据库地理处理工具  | 
| 控制地理数据库配置 | 工具 | 
|---|---|
在 DBTUNE 中添加配置关键字并编辑参数  | 导出地理数据库配置关键字和导入地理数据库配置关键字地理处理工具  | 
更改日志文件表配置  | 配置地理数据库日志文件表地理处理工具  | 
从 Oracle 删除方案地理数据库  | 删除方案地理数据库地理处理工具  | 
升级地理数据库  | 升级地理数据库地理处理工具  | 
| 管理版本化地理数据库 | 工具 | 
|---|---|
创建地理数据库版本  | |
协调版本  | |
提交父版本的更改内容  | |
压缩版本化的地理数据库  | |
删除地理数据库版本  | |
诊断并修复版本元数据和系统表  | |
更新版本系统表的索引  | 重建索引地理处理工具  | 
更新版本系统表的统计数据  | 分析数据集地理处理工具  | 
| 管理连接 | 工具 | 
|---|---|
获取当前地理数据库连接的列表  | ArcGIS for Desktop 中地理数据库管理对话框的连接选项卡或 ListUser Python 函数 您也可以在地理数据库管理对话框中的锁定选项卡中查看连接具有的锁。  | 
从地理数据库中删除连接  | ArcGIS for Desktop 中地理数据库管理对话框的连接选项卡或 DisconnectUser Python 函数  | 
临时阻止地理数据库连接和重新启用连接  | ArcGIS for Desktop 中数据库属性对话框的连接选项卡或 AcceptConnections Python 函数  | 
数据管理
将数据加载到企业级地理数据库中时,您连接的用户将拥有地理数据库中的数据。一些地理数据库管理任务只能由数据所有者执行,例如授予权限或重新构建索引。请确保创建数据库连接文件 (.sde),并在执行这些任务前连接正确的用户。
大多数情况下,ArcSDE 管理命令用于脚本数据加载或管理。所以,在以下部分列出的数据管理任务包括示例脚本。
如果想要作为每个脚本的一部分创建数据库连接文件,请使用 CreateDatabaseConnection_management。
将地理数据库内容导出到可移植文件
说明:将地理数据库方案、关系、行为和数据导出到 XML 工作空间文档以与其他人共享。您也可以将地理数据库内容的子集导出到某 XML 工作空间文档。
可用工具:导出 XML 工作空间文档
示例脚本:
""" Export geodatabase contents to a portable file """
import arcpy
import sys
def ExportXMLWorkspaceDocument(in_data, out_file, export_type=None, storage_type=None, export_metadata=None):
    """ Export geodatabase contents to a portable file """
    try:
        arcpy.ExportXMLWorkspaceDocument_management(in_data,
                                                    out_file,
                                                    export_type,
                                                    storage_type,
                                                    export_metadata)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ExportXMLWorkspaceDocument(*arguments)
导入新地理数据库内容
说明:XML 工作空间文档包括地理数据库方案、关系和行为,同时也可以包括数据。您可导入只包含地理数据库方案的 XML 工作空间文档,然后在该方案中加载您自己的数据。或者您也可以创建模板地理数据库,将该地理数据库中定义的方案和关系导出到 XML 工作空间文档,并将该文档导入到新地理数据库。
可用工具:导入 XML 工作空间文档
示例脚本:
""" Import new gdb contents """
import arcpy
import sys
def ImportXMLWorkspaceDocument(target_geodatabase, in_file, import_type=None, config_keywords=None):
    """ Import new gdb contents """
    try:
        arcpy.ImportXMLWorkspaceDocument_management(target_geodatabase,
                                                    in_file,
                                                    import_type,
                                                    config_keywords)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ImportXMLWorkspaceDocument(*arguments)
导入内容以覆盖旧内容
说明:XML 工作空间文档包括地理数据库方案、关系和行为,同时也可以包括数据。您可以导入包含方案、关系、行为和数据的 XML 工作空间文档并覆盖现有地理数据库的内容。如果从另一个机构或承包商接收项目更新,您可能会执行此操作,并且您会需要所有的最新数据和定义。
可用工具:删除加上导入 XML 工作空间文档
示例脚本:
""" Imports contents to overwrite old contents """
import arcpy
import sys
from xml.etree import ElementTree
import re
def FindDatasets(xml_file):
    """ Open xml file and identify datasets """
    xmldoc = ElementTree.ElementTree()
    xmldoc.parse(xml_file)
    root = xmldoc.getroot()
    contents = []
    for i in root.findall('WorkspaceDefinition/DatasetDefinitions/DataElement'):
        contents.append(i.findtext('Name'))
        for j in i.findall('./Children/DataElement/CatalogPath'):
            contents.append('/'.join(re.split(r'/[a-z|A-Z]*=', j.text)[1:]))
    contents.reverse()
    return contents
def DeleteDatasets(database, datasets):
    """ Delete dataset in database """
    for ds in datasets:
        try:
            arcpy.Delete_management(os.path.join(database, datasets))
        except:
            print('Unable to delete {}'.format(ds))
def ImportXML(database, xml_file):
    """ Import XML workspace document """
    arcpy.ImportXMLWorkspaceDocument_management(database, xml_file)
if __name__ == "__main__":
    xml_file = sys.argv[1]
    database = sys.argv[2]
    datasets = FindDatasets(xml_file)
    DeleteDatasets(database, datasets)
    ImportXML(database, xml_file)
    arcpy.ImportXMLWorkspaceDocument_management(database, xml_file)
导入一个 shapefile 或 coverage 和地图字段
说明:指定从 shapefile 或 coverage 的哪些字段将地图导入到地理数据库生成要素类中的哪些字段。
可用工具:ListFields 加上 FeatureClassToFeatureClass_conversion 加上 FieldMappings
示例脚本:
import arcpy
import os
arcpy.env.overwriteOutput = True
input_features = r'C:\Users\davi4075\Documents\ArcGIS\lakes.shp'
out_fc = r'C:\Users\davi4075\Documents\ArcGIS\mexico.gdb\out_lakes'
fms = arcpy.FieldMappings()
fms.fieldValidationWorkspace = os.path.dirname(out_fc)
# Cycle through input field to transfer
for field in arcpy.ListFields(input_features):
    # Exclude geometry and objectid fields
    if field.type not in ['Geometry', 'OID']:
        fm = arcpy.FieldMap()
        fm.addInputField(input_features, field.name)
        # if altering field properties, need to push updated field back
        # to FieldMap
        field.name = field.name.upper()
        fm.outputField = field
        # Insert FieldMap into FieldMappings
        fms.addFieldMap(fm)
arcpy.FeatureClassToFeatureClass_conversion(
    input_features, os.path.dirname(out_fc), os.path.basename(out_fc),
    field_mapping=fms)
一次导入多个 shapefile 或 coverage
说明:一次导入多个 shapefile 或 coverage
可用工具:要素类至地理数据库
示例脚本:
""" Import multiple shapefiles or coverages at one time """
import arcpy
import sys
def ImportMultiple(input_features, output_database):
    """
    Import multiple shapefiles or coverages at one time
    input_features -- semi-colon delimited string of shapefiles and/or coverages
    """
    try:
        arcpy.FeatureClassToGeodatabase_conversion(input_features, output_database)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ImportMultiple(*arguments)
导入多个 shapefile 或 coverage,并授予现有数据库组对新要素类的权限
说明:一次导入多个 shapefile 或 coverage 并授予现有数据库组对生成要素类的权限,以便组成员访问新要素类。
示例脚本:
"""
Import multiple shapefiles or coverages and grant privileges on new feature
classes to existing groups or users
"""
import arcpy
import sys
def ImportMultipleAndGrantPrivileges(input_features, output_database, user, view=None, edit=None):
    """
    Import multiple shapefiles or coverages and grant privileges on new feature
    classes to existing groups or users
    """
    try:
        feature_classes = input_features.split(';')
        for fc in feature_classes:
            out_fc = arcpy.CreateUniqueName(fc, output_database)
            arcpy.FeatureClassToFeatureClass_conversion(fc, out_fc)
            arcpy.ChangePrivileges_management(out_fc, user, view, edit)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ImportMultipleAndGrantPrivileges(*arguments)
将多个 shapefile 合并到一个要素类
说明:如果您有包含相同类型数据的 shapefile,您可以在地理数据库中将它们合并到一个要素类。例如,如果您拥有表示多个学区中学校的点 shapefile,您可以将这些 shapefile 导入到地理数据库中的某一个学校要素类中。
示例脚本:
""" Combine multiple shapefiles into one feature class """
import arcpy
import sys
def CombineMultipleFeatureClasses(input_features, output_or_target):
    """ Combine multiple shapefiles into one feature class """
    try:
        feature_classes = input_features.split(';')
        if arcpy.Exists(output_or_target):
            arcpy.Append_management(feature_classes, output_or_target)
        else:
            arcpy.Merge_management(feature_classes, output_or_target)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    CombineMultipleFeatureClasses(*arguments)
导入多个表
说明:您可一次将多个 dBASE、INFO、VPF、OLE DB 或地理数据库表导入到您的企业级地理数据库。
可用工具:表转地理数据库(Geodatabase)
示例脚本:
""" Import multiple nonspatial tables """
import arcpy
import sys
def ImportTables(in_tables, target_database):
    """
    Export data to a shapefile
    in_tables -- semi-colon delimited string of tables
    target_database -- the database were tables will be added
    """
    try:
        tables = in_tables.split(";")
        arcpy.TableToGeodatabase_conversion(tables, target_database)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ImportTables(*arguments)
截断表或要素类并追加记录
说明:如果从其他机构或外部组织接收数据更新,您可以保留现有的表和通过截断表与追加数据更新来定义表的权限。
示例脚本:
""" Truncate table or feature class and append records """
import arcpy
import sys
def TruncateTableOrFeatureClass(in_table, target_table):
    """ Truncate table or feature class and append records """
    try:
        arcpy.TruncateTable_management(target_table)
        arcpy.Append_management(in_table, target_table, schema_type="NO_TEST")
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    TruncateTableOrFeatureClass(*arguments)
截断表或要素类、追加记录和更新数据库统计数据
说明:如果从其他机构或外部组织接收数据更新,您可以保留现有的表和通过截断表与追加数据更新来定义表的权限。如果表包含大量记录,您将可能需要在新更新的表中更新数据库统计数据。
示例脚本:
"""
Truncate table or feature class, append records, and update
database statistics
"""
import arcpy
import sys
import os
def TruncateTableOrFeatureClass(in_table, target_table):
    """
    Truncate table or feature class, append records, and update
    database statistics
    """
    try:
        arcpy.TruncateTable_management(target_table)
        arcpy.Append_management(in_table, target_table)
        descr = arcpy.Describe(os.path.dirname(target_table))
        if getattr(descr, 'connectionProperties', None):
            conn = os.path.dirname(target_table)
        else:
            conn = os.path.dirname(os.path.dirname(target_table))
        arcpy.AnalyzeDatasets_management(conn)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    TruncateTableOrFeatureClass(*arguments)
创建非空间数据库视图
说明:数据库视图可合并多个表中的数据并限制从源表中返回的属性。
可用工具:创建数据库视图
示例脚本:
""" Create nonspatial view """
import arcpy
import sys
def CreateNonspatialView(input_database, view_name, view_definition):
    """ Create nonspatial view """
    try:
        arcpy.CreateDatabaseView_management(input_database, view_name, view_definition)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    CreateNonspatialView(*arguments)
创建包含 SQL 几何类型列的数据库视图
说明:数据库视图可合并多个表或要素类中的数据,并限制从源表或要素类中返回的属性。您可以在视图中包括单个 SQL 几何类型列,这样可在 ArcGIS 中显示空间数据。
可用工具:创建数据库视图
示例脚本:
""" Create view containing SQL geometry type column """
import arcpy
import sys
def CreateSpatialView(input_database, view_name, view_definition):
    """ Create view containing SQL geometry type column """
    try:
        arcpy.CreateDatabaseView_management(input_database, view_name, view_definition)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    CreateSpatialView(*arguments)
删除表
说明:您可以一次从地理数据库中删除多个表。如果工作流中的数据为临时数据,例如项目特定的数据或在工作流中接收的替代数据来自外方,这可能非常有用。
可用工具:删除
示例脚本:
""" Delete nonspatial tables """
import arcpy
import sys
def DeleteNonspatialTables(in_data):
    """
    Delete nonspatial tables
    in_data -- semi-colon delimited string of tables
    """
    try:
        tables = in_data.split(';')
        for table in tables:
            arcpy.Delete_management(table)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    DeleteNonspatialTables(sys.argv[1])
删除要素类
说明:您可以一次从地理数据库中删除多个要素类。如果工作流中的数据为临时数据,例如项目特定的数据或在工作流中接收的替代数据来自外方,这可能非常有用。
可用工具:删除
示例脚本:
""" Delete feature classes """
import arcpy
import sys
def DeleteFeatureClasses(in_data):
    """
    Delete feature classes
    in_data -- semi-colon delimited string of feature classes
    """
    try:
        feature_classes = in_data.split(';')
        for fc in feature_classes:
            arcpy.Delete_management(fc)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    DeleteFeatureClasses(sys.argv[1])
将数据导出到 shapefile
说明:将要素类导出到 shapefile。
可用工具:要素类转 Shapefile
示例脚本:
""" Export data to a shapefile """
import arcpy
import sys
def ExportToAShapefile(in_table, target_shp):
    """ Export data to a shapefile """
    try:
        if arcpy.Exists(target_shp):
            arcpy.Append_management(in_table, target_shp, schema_type="NO_TEST")
        else:
            arcpy.CopyRows_management(in_table, target_shp)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ExportToAShapefile(*arguments)
协调、提交和压缩版本化地理数据库
说明:使数据和您的地理数据库版本化,以便编辑需要长时间由多人同时编辑数据的工作流。要实现这一步,要求对地理数据库做出一些维护。这包括根据祖先版本协调版本化数据以整合在祖先版本中的更改、从子版本向祖先版本提交编辑内容以及压缩地理数据库以移除不需要的版本状态。
示例脚本:
""" Reconcile, post, and compress versioned geodatabase """
import arcpy
import sys
def ReconcilePostAndCompress(input_database, reconcile_mode):
    """
    Reconcile, post, and compress versioned geodatabase
    """
    try:
        arcpy.ReconcileVersions_management(input_database, reconcile_mode)
        arcpy.Compress_management(input_database)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    ReconcilePostAndCompress(*arguments)
同时,请参阅使用 Python 脚本批量协调和提交版本。
版本化表或要素类,向其添加全局 ID,然后创建复本
说明:表或要素类必须注册为版本化并包含全局 ID 列才能进行复制。
示例脚本:
""" Version tables, add global IDs to tables, and create a replica """
import arcpy
import sys
def VersionTablesEtc(in_tables, in_type=None, out_geodatabase=None, out_name=None):
    """ Version tables, add global IDs to tables, and create a replica """
    try:
        tables = in_tables.split(';')
        for table in tables:
            arcpy.RegisterAsVersioned_management(table)
        arcpy.AddGlobalIDs_management(tables)
        if 'CreateReplica' in dir(arcpy.management):
            arcpy.CreateReplica_management(tables, in_type, out_geodatabase, out_name)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    arguments = sys.argv[1:]
    VersionTablesEtc(*arguments)
将第三方表注册到地理数据库
说明:如果使用第三方应用程序或 SQL 在存储地理数据库的数据库中创建表(空间以及非空间),那么您可以将表注册到地理数据库。这会将表的相关信息添加到地理数据库系统表,然后这些表便可以作为地理数据库的一项功能。
示例脚本:
""" Register third-party tables with the geodatabase """
import arcpy
import sys
def RegisterThirdPartyTables(in_tables):
    """
    Register third-party tables with the geodatabase
    in_tables -- semi-colon delimited string of tables
    """
    try:
        tables = in_tables.split(';')
        for table in tables:
            arcpy.RegisterWithGeodatabase_management(table)
    except arcpy.ExecuteError:
        print(arcpy.GetMessages(2))
if __name__ == "__main__":
    RegisterThirdPartyTables(sys.argv[1])