在 PostgreSQL 基于云的数据库服务中创建地理数据库

ArcGIS 支持基于 PostgreSQL 的多个云数据库即服务提供商。 您可以在大多数 Esri 支持的 PostgreSQL 基于云的数据库服务中创建企业级地理数据库。

如果在 ArcGIS AllSource 3.3 中创建地理数据库,则地理数据库版本为 11.3.0。

完成先决条件

在创建地理数据库之前,必须在云帐户中创建数据库实例、对其进行配置以接收连接、创建 sde 用户和方案,并授予 sde 用户创建地理数据库的权限。

按照云提供商提供的说明,完成这些步骤。

此外,还必须将 ArcGIS Server 密钥授权文件复制到安装 ArcGIS 客户端的云计算机上,以创建地理数据库。

在创建地理数据库之前,请完成以下先决条件步骤:

  1. 确认您使用的 ArcGIS 版本支持要使用的基于云的数据库类型和版本
  2. 在所选云平台中创建数据库服务实例。
  3. 为数据库实例创建名为 sde 的用户登录帐户。
  4. 针对您使用的数据库服务类型,为 sde 用户授予创建地理数据库所需的权限
  5. 在数据库实例中创建名为 sde 的方案,并授予 sde 用户在该方案上的权限。
  6. 安装将用于创建地理数据库的 ArcGIS 客户端(ArcGIS AllSourceArcGIS Server)。

    在同一云平台和区域内安装用于数据库服务运行的 ArcGIS 客户端。

  7. 确保数据库实例已配置为允许来自 ArcGIS 客户端的连接。
  8. 从您在步骤 6 中安装的 ArcGIS 客户端,创建一个到数据库实例的数据库连接,并以 sde 用户身份连接。

    有关实例字符串,请参阅 ArcGIS AllSource 中的数据库连接示例。

    如果 sde 用户为数据库身份验证用户,则必须在数据库连接中保存 sde 用户的密码。

  9. 获取 ArcGIS Server 密钥代码文件,并将其放置到用于创建地理数据库的 ArcGIS 客户端可访问的位置。

现在,您可以在云中的数据库实例中创建地理数据库。

在数据库服务实例中创建地理数据库

如果已在与数据库服务相同的云区域中安装了 ArcGIS AllSource,则可以运行启用企业级地理数据库地理处理工具在数据库实例中创建地理数据库,如下面的第一部分中所述。

您也可以在 Python 窗口中运行 EnableEnterpriseGeodatabase ArcPy 函数,或从云中的 ArcGIS AllSourceArcGIS Server 安装中运行 Python 脚本

运行启用企业级地理数据库工具

请遵照以下步骤使用 ArcGIS AllSource 中的启用企业级地理数据库工具创建地理数据库:

  1. 登录到云环境中的虚拟机,然后启动 ArcGIS AllSource
  2. 打开启用企业级地理数据库工具。
  3. 对于输入数据库连接参数,提供作为先决条件步骤的一部分创建的数据库连接文件。
  4. 对于授权文件,请浏览到在授权 ArcGIS Server(企业版)时创建的密钥代码文件,并选择该文件。

    Windows 上安装 ArcGIS Server 时,该文件将写入 \\Program Files\ESRI\License<release#>\sysgen,在 Linux 上安装 ArcGIS Server 时,该文件写入 /arcgis/server/framework/runtime/.wine/drive_c/Program Files/ESRI/License<release#>/sysgen

  5. 单击运行

您现已在数据库实例中具有一个地理数据库。

可在 sde_setup.log 文件中查找创建地理数据库的相关消息,该文件是在运行脚本的虚拟机上为 TEMP 变量指定的目录中创建的。 如果在创建地理数据库时出现问题,可查看此文件以解决这些问题。

接下来,数据库管理员可以为将创建、编辑和查看数据的用户创建登录角色和匹配架构,并为编辑者和数据查看者创建登录角色。

运行 EnableEnterpriseGeodatabase ArcPy 函数

要运行 ArcPy 函数,需连接到云中的一个 ArcGIS 客户端计算机,并从 Python 窗口中运行该函数。

  1. 登录到已安装 ArcGIS AllSourceArcGIS Server 的云环境中的虚拟机。
  2. 访问 Python 窗口。

    有关从 ArcGIS 安装访问 Python 的信息,请参阅以下内容:

  3. Python 窗口中运行 EnableEnterpriseGeodatabase ArcPy 函数。

    使用您创建的数据库连接文件,并引用作为先决条件步骤之一放置于可访问位置的 ArcGIS Server 授权文件。

    在以下示例中,将从 ArcGIS AllSource 安装中运行 EnableEnterpriseGeodatabase 函数。 数据库连接文件 (postresdbaas.sde) 存储在 ArcGIS AllSource 工程文件夹 (C:\proprojects\pg_proj) 中,授权文件 (keycodes) 存储在 C:\authcodes 中。

    arcpy.management.EnableEnterpriseGeodatabase(r"C:\proprojects\pg_proj\postresdbaas.sde",r"C:\authcodes\keyfile")

    在下一示例中,将从 Linux 计算机上的 ArcGIS Server 安装中运行函数。 数据库连接文件 (postresdbaas.sde) 存储在 /usr/connectionfiles 中,密钥代码文件存储在默认 ArcGIS Server 位置。

    arcpy.management.EnableEnterpriseGeodatabase("/usr/connectionfiles/postresdbaas.sde","/usr/arcgis/server/framework/runtime/.wine/drive_c/Program Files/ESRI/License/sysgen/keycodes")

您现已在数据库实例中具有一个地理数据库。

可在 sde_setup.log 文件中查找创建地理数据库的相关消息,该文件是在运行函数的虚拟机上为 TEMP 变量指定的目录中创建的。 如果在创建地理数据库时出现问题,可查看此文件以解决这些问题。

接下来,数据库管理员可以为将创建、编辑和查看数据的用户创建登录角色和匹配架构,并为编辑者和数据查看者创建登录角色。

在 ArcGIS 客户端中运行 Python 脚本

要通过从 ArcGIS AllSourceDesktop StandardDesktop Advanced)或 ArcGIS Server 计算机运行脚本来创建地理数据库,可以使用此处提供的脚本。

请按照以下步骤运行 Python 脚本,该脚本调用 CreateDatabaseConnectionEnableEnterpriseGeodatabase ArcPy 函数以连接到数据库,并在 PostgreSQL 数据库服务中创建地理数据库:

  1. 在 ArcGIS 客户端计算机上创建文本文件,然后将以下脚本复制到该文件中:

    """
    Name: enable_enterprise_gdb.py
    Description: Provide connection information to an enterprise database
    and enable enterprise geodatabase.
    Type enable_enterprise_gdb.py -h or enable_enterprise_gdb.py --help for usage
    """
    
    # Import system modules
    import arcpy, os, optparse, sys
    
    
    # Define usage and version
    parser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for " + arcpy.GetInstallInfo()['Version'] )
    
    #Define help and options
    parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['SQL_SERVER', 'ORACLE', 'POSTGRESQL', 'DB2','INFORMIX','DB2ZOS', ''], default="", help="Type of enterprise DBMS:  SQL_SERVER, ORACLE, POSTGRESQL, DB2, INFORMIX, or DB2ZOS.")
    parser.add_option ("-i", dest="Instance", type="string", default="", help="DBMS instance name")
    parser.add_option ("--auth", dest="account_authentication", type ="choice", choices=['DATABASE_AUTH', 'OPERATING_SYSTEM_AUTH'], default='DATABASE_AUTH', help="Authentication type options (case-sensitive):  DATABASE_AUTH, OPERATING_SYSTEM_AUTH.  Default=DATABASE_AUTH")
    parser.add_option ("-u", dest="User", type="string", default="", help="Geodatabase administrator user name")
    parser.add_option ("-p", dest="Password", type="string", default="", help="Geodatabase  administrator password")
    parser.add_option ("-D", dest="Database", type="string", default="none", help="Database name:  Not required for Oracle")
    parser.add_option ("-l", dest="Authorization_file", type="string", default="", help="Full path and name of authorization file")
    
    
    # Check if value entered for option
    try:
    	(options, args) = parser.parse_args()
    
    	
    #Check if no system arguments (options) entered
    	if len(sys.argv) == 1:
    		print("%s: error: %s\n" % (sys.argv[0], "No command options given"))
    		parser.print_help()
    		sys.exit(3)
    	
    
    	#Usage parameters for spatial database connection
    	database_type = options.Database_type.upper()
    	instance = options.Instance
    	account_authentication = options.account_authentication.upper()
    	username = options.User.lower() 
    	password = options.Password	
    	database = options.Database.lower()
    	license = options.Authorization_file
    
    
    	if( database_type ==""):	
    		print(" \n%s: error: \n%s\n" % (sys.argv[0], "DBMS type (--DBMS) must be specified."))
    		parser.print_help()
    		sys.exit(3)		
    		
    	if (license == ""):
    		print(" \n%s: error: \n%s\n" % (sys.argv[0], "Authorization file (-l) must be specified."))
    		parser.print_help()
    		sys.exit(3)
    
    		
    	# Get the current product license
    	product_license=arcpy.ProductInfo()
    	
    	if (license == ""):
    		print(" \n%s: error: %s\n" % (sys.argv[0], "Authorization file (-l) must be specified."))
    		parser.print_help()
    		sys.exit(3)
    	
    	# Checks required license level
    	if product_license.upper() == "ARCVIEW" or product_license.upper() == 'ENGINE':
    		print("\n" + product_license + " license found!" + "  Enabling enterprise geodatabase functionality requires an ArcGIS Desktop Standard or Advanced, ArcGIS Engine with the Geodatabase Update extension, or ArcGIS Server license.")
    		sys.exit("Re-authorize ArcGIS before enabling an enterprise geodatabase.")
    	else:
    		print("\n" + product_license + " license available!  Continuing to enable...")
    		arcpy.AddMessage("+++++++++")
    	
    	# Local variables
    	instance_temp = instance.replace("\\","_")
    	instance_temp = instance_temp.replace("/","_")
    	instance_temp = instance_temp.replace(":","_")
    	Conn_File_NameT = instance_temp + "_" + database + "_" + username    
    	
    	if os.environ.get("TEMP") == None:
    		temp = "c:\\temp"	
    	else:
    		temp = os.environ.get("TEMP")
    	
    	if os.environ.get("TMP") == None:
    		temp = "/usr/tmp"		
    	else:
    		temp = os.environ.get("TMP")  
    	
    
    	Connection_File_Name = Conn_File_NameT + ".sde"
    	Connection_File_Name_full_path = temp + os.sep + Conn_File_NameT + ".sde"
    	
    	# Check for the .sde file and delete it if present
    	arcpy.env.overwriteOutput=True
    	if os.path.exists(Connection_File_Name_full_path):
    		os.remove(Connection_File_Name_full_path)
    	
    	print("\nCreating Database Connection File...\n")	
    	# Process: Create Database Connection File...
    	# Usage:  out_file_location, out_file_name, DBMS_TYPE, instnace, database, account_authentication, username, password, save_username_password(must be true)
    	arcpy.CreateDatabaseConnection_management(out_folder_path=temp, out_name=Connection_File_Name, database_platform=database_type, instance=instance, database=database, account_authentication=account_authentication, username=username, password=password, save_user_pass="TRUE")
    	for i in range(arcpy.GetMessageCount()):
    
                    if "000565" in arcpy.GetMessage(i):   #Check if database connection was successful
    
                            arcpy.AddReturnMessage(i)
    
                            arcpy.AddMessage("\n+++++++++")
    
                            arcpy.AddMessage("Exiting!!")
    
                            arcpy.AddMessage("+++++++++\n")
    
                            sys.exit(3)
    
                    else:
    
                            arcpy.AddReturnMessage(i)
    
                            arcpy.AddMessage("+++++++++\n")
    	
    	# Process: Enable geodatabase...
    	try:
    		print("Enabling Enterprise Geodatabase...\n")
    		arcpy.EnableEnterpriseGeodatabase_management(input_database=Connection_File_Name_full_path, authorization_file=license)
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    		arcpy.AddMessage("+++++++++\n")
    	except:
    		for i in range(arcpy.GetMessageCount()):
    			arcpy.AddReturnMessage(i)
    			
    	if os.path.exists(Connection_File_Name_full_path):
    		os.remove(Connection_File_Name_full_path)
    			
    #Check if no value entered for option	
    except SystemExit as e:
    	if e.code == 2:
    		parser.usage = ""
    		print("\n")
    		parser.print_help() 
    		parser.exit(2)

  2. .py 扩展名保存该文件。
  3. 运行脚本,同时提供特定于您的实例的选项和信息。

    在以下示例,将从与数据库服务相同的云区域中的虚拟机上运行 enable_gdb.py 文件。

    在此示例中,脚本从 Linux 计算机上的 ArcGIS Server 安装中运行。 它连接到 us-west-2 区域 (database-1-instance-1.zyxjtlpj9fer.us-west-2.rds.amazonaws.com) 中的 Amazon Aurora PostgreSQL 实例中名为 myauroradb 的数据库。 密钥代码文件放置在 ArcGIS Server 计算机上的 /usr/arcgis/auth 中。

    ./enable_gdb.py --DBMS POSTGRESQL -i database-1-instance-1.zyxjtlpj9fer.us-west-2.rds.amazonaws.com --auth DATABASE_AUTH 
    -u sde -p sdeP@ss -D myauroradb -l '/usr/arcgis/auth/keycodes'

    在下一示例中,将在 Azure 中的 Microsoft Windows 计算机上运行脚本。 它连接到 Microsoft Azure Database for PostgreSQL (灵活服务器)实例 my-pg-flex.postgres.database.azure.com 中名为 azurepgf 的数据库。 密钥代码文件位于默认 ArcGIS Server 位置。

    enable_gdb.py --DBMS POSTGRESQL -i my-pg-flex.postgres.database.azure.com --auth DATABASE_AUTH 
    -u sde -p EsDeeEpass -D azurepgf -l '\\Program Files\ESRI\License\sysgen\keycodes'

    在以下示例中,将从安装 ArcGIS AllSource 的计算机上运行脚本,密钥代码文件将放置在 Users\MyUser\Documents\AuthFiles\keycodes 中。 脚本将连接到可通过公共 IP 地址 98.765.43.210 访问的 Google Cloud SQL for PostgreSQL 实例中的数据库 (gcspostgres)。

    enable_gdb.py --DBMS POSTGRESQL -i 98.765.43.210 --auth DATABASE_AUTH 
    -u sde -p Zpassw0rd -D gcspostgres -l '\\Users\MyUser\Documents\AuthFiles\keycodes'

    提示:

    在命令提示符处输入 -h--help 以获取有关此脚本的语法帮助。

您现已在数据库实例中具有一个地理数据库。

可在 sde_setup.log 文件中查找创建地理数据库的相关消息,该文件是在运行脚本的虚拟机上为 TEMP 或 TMP 变量指定的目录中创建的。 如果在创建地理数据库时出现问题,可查看此文件以解决这些问题。

接下来,数据库管理员可以为将创建、编辑和查看数据的用户创建登录角色和匹配架构,并为编辑者和数据查看者创建登录角色。