Hinzufügen von Anmeldungen und Benutzern zu SQL Server

In Microsoft SQL Server fügen Datenbankadministratoren Anmeldungen zur SQL Server-Instanz hinzu. Diese Anmeldungen werden Benutzern in verschiedenen Datenbanken auf der SQL Server-Instanz zugeordnet. Datenbankbenutzer, die Tabellen und Feature-Classes erstellen sollen, benötigen Berechtigungen zum Erstellen dieser Objekte in der Datenbank und müssen über ein Schema verfügen, in dem sie diese erstellen können. Bei der Verwendung von ArcGIS muss dieses Schema den gleichen Namen wie der Datenbankbenutzer haben.

Mit dem Werkzeug oder Skript Datenbankbenutzer erstellen können Sie die folgenden Aktionen ausführen:

  • Eine Anmeldung zur SQL Server-Instanz erstellen oder hinzufügen
  • Einen Benutzer erstellen, der dem angegebenen Anmeldenamen zugeordnet ist
  • Ein passendes Schema für den Benutzer in der angegebenen Datenbank erstellen
  • Dem Benutzer ausreichende Berechtigungen zum Erstellen von Tabellen, Feature-Classes und Sichten in der angegebenen Datenbank gewähren

Hinzufügen eines Benutzers, der Daten erstellen kann

Sie können das Werkzeug Datenbankbenutzer erstellen in ArcGIS Desktop verwenden oder das Werkzeug in einem Python-Skript aufrufen, um einen Datenbankbenutzer zu erstellen, der Tabellen, Feature-Classes und Sichten erstellen kann. Für die Ausführung dieses Werkzeugs ist eine Standard- oder Advanced-Lizenz erforderlich.

Sie müssen mit einem Anmeldenamen mit sysadmin-Berechtigungen zur SQL Server-Instanz mit der Datenbank verbunden sein, um das Werkzeug Datenbankbenutzer erstellen auszuführen.

Wenn Sie einen Datenbankbenutzer für Microsoft Windows-Anmeldedaten erstellen möchten, müssen die Anmeldedaten vorhanden sein, bevor Sie das Werkzeug ausführen.

Verwenden des Werkzeugs Datenbankbenutzer erstellen

  1. Starten Sie ArcGIS Pro.
  2. Stellen Sie mit einem Anmeldenamen mit sysadmin-Berechtigungen in der SQL Server-Instanz eine Verbindung mit der Datenbank oder Geodatabase her.
  3. Öffnen Sie das Werkzeug Datenbankbenutzer erstellen.

    Das Werkzeug befindet sich in der Toolbox "Data Management" im Toolset "Geodatabase-Verwaltung".

  4. Geben Sie die Datenbankverbindung für die Eingabe-Datenbankverbindung an.
  5. Wählen Sie aus, ob Sie eine SQL Server-authentifizierte Anmeldung oder eine vorhandene Windows-authentifizierte Anmeldung verwenden möchten.
    • Lassen Sie Betriebssystem-authentifizierten Benutzer erstellen deaktiviert, um eine Anmeldung mit SQL Server-Authentifizierung zu erstellen. Beachten Sie, dass bei SQL Server-Instanzen standardmäßig nur die Windows-Authentifizierung verwendet wird. Wurde die Verwendung der SQL Server- und der Windows-Authentifizierung in der Instanz nicht konfiguriert, ist die Erstellung einer Anmeldung mit Datenbankauthentifizierung nicht möglich.
    • Aktivieren Sie Betriebssystem-authentifizierten Benutzer erstellen, um eine vorhandene Anmeldung mit Windows-Authentifizierung zu verwenden.
  6. Geben Sie einen Namen für den Datenbankbenutzer ein, der von dem Werkzeug erstellt wird.

    Wenn Sie eine Anmeldung mit SQL Server-Authentifizierung erstellen möchten, wird der hier eingegebene Name auch für die Anmeldung verwendet.

  7. Geben Sie ein Kennwort für den Datenbankbenutzer ein.
  8. Wenn Sie bereits über eine Datenbankrolle verfügen, der Sie diesen Benutzer hinzufügen möchten, geben Sie die Rolle an.
  9. Klicken Sie auf Ausführen.

Ausführen eines Python-Skripts

Führen Sie die folgenden Schritte aus, um ein Skript für die Benutzererstellung zu erzeugen:

  1. Erstellen Sie eine Textdatei auf einem ArcGIS-Client-Computer, und kopieren Sie das folgende Skript in die Datei.

    """
    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)

    Sie können das Skript auf einem Computer ausführen, auf dem ArcGIS Pro (Standard oder Advanced) oder ArcGIS Server oder ArcGIS for Server installiert ist.

  2. Speichern Sie die Datei mit der Erweiterung .py.
  3. Führen Sie das Skript aus, und geben Sie dabei Optionen und Informationen zur SQL Server-Instanz und dem Benutzer, den Sie erstellen möchten, an.

    Im folgenden Beispiel lautet der Name des Skripts "create_database_user.py". Es werden eine Anmeldung mit SQL Server-Authentifizierung (gisd_owner) in der SQL Server-Instanz "ssi5" und ein entsprechender Benutzer mit Schema in der Datenbank "gisdata" erstellt. Der Benutzer wird keiner Rolle hinzugefügt.

    create_database_user.py --DBMS SQL_SERVER -i ssi5 -D gisdata --auth DATABASE_AUTH -U sa -P !nocopy! --utype DATABASE_USER -u gisd_owner -p T3mpPass

    Tipp:

    Geben Sie in der Eingabeaufforderung -h oder --help ein, um die Syntaxhilfe aufzurufen.

Die Datenbank enthält nun einen Benutzer, der Tabellen erstellen kann.

Sobald die Daten erstellt wurden, kann der Datenbesitzer anderen Benutzern Berechtigungen für die Datasets erteilen. Anweisungen finden Sie unter Gewähren und Widerrufen von Dataset-Berechtigungen.

Erstellen von Anmeldungen und Benutzern mit SQL Server-Werkzeugen

Wenn Sie einen Benutzer erstellen möchten, dessen Berechtigungen sich von den mit dem Werkzeug Datenbankbenutzer erstellen gewährten Berechtigungen unterscheiden oder dem keine Berechtigungen direkt gewährt werden, können Sie dazu die SQL Server-Werkzeuge verwenden. Beachten Sie bei der Erstellung eigener Anmeldungen und Benutzer, die mit ArcGIS verwendet werden sollen, Folgendes:

  • Alle Datenbankbenutzer, die Daten erstellen, müssen über ein Schema in der Datenbank verfügen. Dieses Schema muss den gleichen Namen wie der Benutzer haben.
  • Anstelle von einzelnen Windows-Benutzern können Sie auch einer Windows-Gruppe den Zugriff auf SQL Server gewähren, um die Erstellung und Verwaltung von Anmeldungen zu vereinfachen. Alle Mitglieder der Windows-Gruppe können sich bei SQL Server anmelden. Server-, Datenbank- und Dataset-Berechtigungen, die der Gruppe gewährt werden, gelten automatisch für jedes Mitglied der Gruppe. Beachten Sie jedoch, dass Sie nicht nur ein Schema zum Speichern der von allen Gruppenmitgliedern erzeugten Daten erstellen können. Jeder Benutzer in der Gruppe, der Daten in der Geodatabase erstellt, muss ein eigenes Schema haben, in dem die Daten gespeichert werden. SQL Server erstellt einen Benutzer und ein Schema in der Datenbank, wenn ein Gruppenmitglied das erste Mal Daten erstellt. Dies erfolgt automatisch. Schemas und Benutzer müssen nicht manuell erstellt werden.

Anweisungen zum Erstellen von Anmeldungen, Benutzern und Schemas mit den SQL Server-Werkzeugen finden Sie in der Microsoft SQL Server-Dokumentation.