创建数据库用户 (数据管理)

摘要

在数据库中创建具有足够权限可创建数据的数据库用户。

使用情况

  • 该工具仅适用于 OracleMicrosoft SQL ServerPostgreSQLSAP HANA。 此工具不适用于大多数基于云的数据库服务。 唯一支持的数据库服务是 Google Cloud SQL for PostgreSQL

  • 对于 OracleSQL Server,如果操作系统登录帐户名存在,则创建数据库用户工具可将此登录帐户作为用户添加到指定数据库。

  • 无法为 Microsoft Windows 组创建数据库用户。

  • Oracle 中的地理数据库上运行时,此工具将针对用户创建共享日志文件表。

  • 在数据库中创建的用户被授予以下权限:

    DBMS权限

    Oracle

    CREATE PROCEDURE

    CREATE SESSION

    CREATE SEQUENCE

    CREATE TABLE

    CREATE TRIGGER

    CREATE VIEW

    SELECT ON DBA_ROLES

    PostgreSQL

    CONNECT

    TEMPORARY

    如果用户是在地理数据库或安装了 ST_Geometry 类型的数据库中创建的,则对 sde 方案具有 USAGE 权限

    如果在数据库中安装 PostGIS,则对 geometry_columnsgeography_columns 视图具有 SELECT、INSERT、UPDATE 和 DELETE 权限,并且对 spatial_ref_sys 视图具有 SELECT 权限。

    SQL Server

    CREATE TABLE

    CREATE PROCEDURE

    CREATE VIEW

    SAP HANA

    该工具用于创建 SAP HANA 标准用户。

  • 如果 SQL Server 实例或 PostgreSQL 数据库集群中不存在登录帐户,则创建数据库用户工具会添加登录帐户,在为输入数据库连接参数指定的数据库中创建用户并为数据库中的用户创建方案。 指定的数据库在 SQL Server 中会设置为用户默认数据库。

  • 如果 SQL Server 实例中存在登录帐户,则创建数据库用户工具会将用户添加到输入数据库连接参数所指定的数据库中并创建匹配的方案。 用户默认数据库在 SQL Server 中保持不变。

  • 如果 PostgreSQL 数据库集群中已存在登录帐户,则创建数据库用户工具会在为输入数据库连接参数指定的数据库中创建匹配方案。

  • 无法使用此工具创建名为 sde 的用户。 sde 用户是地理数据库管理员用户,所需的权限比创建数据库用户工具所授予的权限更多。

  • 指定用户名时不能使用双引号等定界符。 在不提供定界符的情况下,用户名仅能包含基础数据库管理系统支持的字符。

参数

标注说明数据类型
输入数据库连接

OraclePostgreSQLSQL Server 中的企业级地理数据库的连接文件。 请确保以数据库管理员用户身份建立连接。 连接到 Oracle 时,必须以系统用户身份进行连接。

Workspace
创建经操作系统验证的用户
(可选)

指定用户的身份验证类型。 仅当要为其创建数据库用户的操作系统登录存在时,才使用此参数。 仅 SQL ServerOracle 数据库支持此选项,因为 ArcGIS 仅支持对这两个数据库进行操作系统身份验证。

  • 选中 - 将创建经过操作系统身份验证的用户。 相应的登录帐户必须已存在。
  • 未选中 - 将创建经过数据库身份验证的用户。 这是默认设置。
Boolean
数据库用户

新数据库用户的名称。

如果您选择为操作系统登录创建数据库用户,则用户名必须与登录名匹配。

String
数据库用户密码
(可选)

新用户的密码。 强制实行基础数据库的密码策略。

如果您选择为操作系统登录创建数据库用户,则将不需要任何输入。

Encrypted String
角色
(可选)

要将新用户添加到的现有数据库角色的名称。

String
表空间名称
(可选)

将用作 Oracle 数据库中新用户的默认表空间的表空间的名称。 可指定预配置表空间,如果表空间不存在,则将在 Oracle 默认存储位置创建大小设置为 400 MB 的表空间。 如果未指定表空间,则用户的默认表空间将设置为 Oracle 默认表空间。

String

派生输出

标注说明数据类型
数据库用户已创建

工具是否成功执行。

Boolean

arcpy.management.CreateDatabaseUser(input_database, {user_authentication_type}, user_name, {user_password}, {role}, {tablespace_name})
名称说明数据类型
input_database

OraclePostgreSQLSQL Server 中的企业级地理数据库的连接文件。 请确保以数据库管理员用户身份建立连接。 连接到 Oracle 时,必须以系统用户身份进行连接。

Workspace
user_authentication_type
(可选)

指定用户的身份验证类型。 如果指定 OPERATING_SYSTEM_USER,则必须已存在您将创建的用户的操作系统登录帐户。 仅 SQL ServerOracle 数据库支持操作系统用户。

  • DATABASE_USER将创建经过数据库身份验证的用户。 这是默认设置。如果数据库管理系统没有配置为允许数据库身份验证,则将不会使用该选项。
  • OPERATING_SYSTEM_USER将创建经过操作系统身份验证的用户。 相应的登录帐户必须已存在。如果数据库管理系统没有配置为允许操作系统身份验证,则将不会使用该选项。
Boolean
user_name

新数据库用户的名称。

如果您选择为操作系统登录创建数据库用户,则用户名必须与登录名匹配。

String
user_password
(可选)

新用户的密码。 强制实行基础数据库的密码策略。

如果您选择为操作系统登录创建数据库用户,则将不需要任何输入。

Encrypted String
role
(可选)

要将新用户添加到的现有数据库角色的名称。

String
tablespace_name
(可选)

将用作 Oracle 数据库中新用户的默认表空间的表空间的名称。 可指定预配置表空间,如果表空间不存在,则将在 Oracle 默认存储位置创建大小设置为 400 MB 的表空间。 如果未指定表空间,则用户的默认表空间将设置为 Oracle 默认表空间。

String

派生输出

名称说明数据类型
out_result

工具是否成功执行。

Boolean

代码示例

CreateDatabaseUser 示例 1 (Python 窗口)

此示例脚本使用预定义的数据库连接文件(oracledb1.sde)在 Oracle 中创建数据库用户并为该用户创建默认表空间(sdetbs)。

import arcpy
arcpy.CreateDatabaseUser_management("C:/myconnections/oracledb1.sde", 
                                    "DATABASE_USER", "map", "Pam987", "sdetbs")
CreateDatabaseUser 示例 2 (Python 窗口)

此示例脚本在 connections 文件夹中创建输入工作空间(pgconn.sde),并在 PostgreSQL 中创建数据库登录角色和方案。

import arcpy
arcpy.CreateDatabaseConnection_management("C:/connections", "pgconn.sde", 
                                          "POSTGRESQL", myserver, mypgdb, 
                                          "DATABASE_AUTH", "ela", "3L@pwd", 
                                          "SAVE_USERNAME")
arcpy.CreateDatabaseUser_management("C:/connections/pgconn.sde", 
                                    "DATABASE_USER", "dataowner", "N0look")
CreateDatabaseUser 示例 3(Python 窗口)

此示例脚本在 SQL Server 中创建映射到现有操作系统登录用户 (mynet\vorhoos) 的数据库用户,并使用预定义数据库连接文件(connection_ssi.sde)。

import arcpy
arcpy.CreateDatabaseUser_management("C:/gdbconnections/connection_ssi.sde", 
                                    "OPERATING_SYSTEM_USER", "mynet\\vorhoos")
CreateDatabaseUser 示例 4(独立脚本)

以下独立脚本可以使用选项提供站点特定的信息,从而创建数据库用户:

"""
Name: create_database_user.py
Description: Provide connection information to a database user.
Type create_database_user.py -h or create_database_user.py --help for usage
"""

# Import system modules
import arcpy
import os
import optparse
import sys


# Define usage and version
parser = optparse.OptionParser(usage = "usage: %prog [Options]", version="%prog 1.0 for 10.1 release")

#Define help and options
parser.add_option ("--DBMS", dest="Database_type", type="choice", choices=['SQLSERVER', 'ORACLE', 'POSTGRESQL', ''], default="", help="Type of enterprise DBMS:  SQLSERVER, ORACLE, or POSTGRESQL.")                   
parser.add_option ("-i", dest="Instance", type="string", default="", help="DBMS instance name")
parser.add_option ("-D", dest="Database", type="string", default="none", help="Database name:  Not required for Oracle")
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="Dbms_admin", type="string", default="", help="DBMS administrator user")
parser.add_option ("-P", dest="Dbms_admin_pwd", type="string", default="", help="DBMS administrator password")
parser.add_option ("--utype", dest="user_type", type ="choice", choices=['DATABASE_USER', 'OPERATING_SYSTEM_USER'], default='DATABASE_USER', help="Authentication type options (case-sensitive):  DATABASE_USER, OPERATING_SYSTEM_USER.  Default=DATABASE_USER")
parser.add_option ("-u", dest="dbuser", type="string", default="", help="database user name")
parser.add_option ("-p", dest="dbuser_pwd", type="string", default="", help="database user password")
parser.add_option ("-r", dest="role", type="string", default="", help="role to be granted to the user")
parser.add_option ("-t", dest="Tablespace", type="string", default="", help="Tablespace name")
# 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
	database = options.Database.lower()	
	account_authentication = options.Account_authentication.upper()
	dbms_admin = options.Dbms_admin
	dbms_admin_pwd = options.Dbms_admin_pwd
	dbuser = options.dbuser
	dbuser_pwd = options.dbuser_pwd	
	tablespace = options.Tablespace
	user_type = options.user_type
	role = options.role

	
	if (database_type == "SQLSERVER"):
		database_type = "SQL_SERVER"
	
	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(database_type == "SQL_SERVER"):
		if( account_authentication == "DATABASE_AUTH" and dbms_admin == ""):
			print("\n%s: error: %s\n" % (sys.argv[0], "DBMS administrator must be specified with database authentication"))
			sys.exit(3)
		if( account_authentication == "OPERATING_SYSTEM_AUTH" and dbms_admin != ""):
			print("\nWarning: %s\n" % ("Ignoring DBMS administrator specified when using operating system authentication..."))
	else:		
		if( dbuser.lower() == ""):
			print("\n%s: error: %s\n" % (sys.argv[0], "Database user must be specified."))
			sys.exit(3)		
		if( dbms_admin == ""):
			print("\n%s: error: %s\n" % (sys.argv[0], "DBMS administrator must be specified!"))
			sys.exit(3)

	if ( user_type == "DATABASE_USER" and (dbuser =="" or dbuser_pwd =="")):
		print(" \n%s: error: \n%s\n" % (sys.argv[0], "To create database authenticated user, user name and password must be specified!"))
		parser.print_help()
		sys.exit(3)	

	# Get the current product license
	product_license=arcpy.ProductInfo()
	
	# Checks required license level
	if product_license.upper() == "ARCVIEW" or product_license.upper() == 'ENGINE':
		print("\n" + product_license + " license found!" + "  Creating a user in an enterprise geodatabase or database requires an ArcGIS Desktop Standard or Advanced, ArcGIS Engine with the Geodatabase Update extension, or ArcGIS Server license.")
		sys.exit("Re-authorize ArcGIS before creating a database user.")
	else:
		print("\n" + product_license + " license available!  Continuing to create...")
		arcpy.AddMessage("+++++++++")

	# Local variables
	instance_temp = instance.replace("\\","_")
	instance_temp = instance_temp.replace("/","_")
	instance_temp = instance_temp.replace(":","_")
	Conn_File_NameT = instance_temp + "_" + database + "_" + dbms_admin   

	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)

	try:
		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(temp , Connection_File_Name, database_type, instance, database, account_authentication, dbms_admin, dbms_admin_pwd, "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=dbms_admin, password=dbms_admin_pwd, 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")

		print("Creating database user...\n")
		arcpy.CreateDatabaseUser_management(input_workspace=Connection_File_Name_full_path, user_authentication_type=user_type, user_name=dbuser, user_password=dbuser_pwd, role=role, tablespace_name=tablespace)
		for i in range(arcpy.GetMessageCount()):
			arcpy.AddReturnMessage(i)
		arcpy.AddMessage("+++++++++\n")
	except:
		for i in range(arcpy.GetMessageCount()):
			arcpy.AddReturnMessage(i)
			
#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)

环境

特殊情况

许可信息

  • Basic: 否
  • Standard: 是
  • Advanced: 是

相关主题