Ajouter des identifiants de connexion et des utilisateurs à SQL Server

Dans Microsoft SQL Server, les administrateurs de base de données ajoutent des identifiants de connexion à l'instance SQL Server et une correspondance est établie entre ces identifiants de connexion et les utilisateurs dans des bases de données individuelles de l'instance SQL Server. Les utilisateurs de bases de données qui doivent créer des tables et des classes d'entités doivent bénéficier des privilèges nécessaires pour créer ces objets dans la base de données et posséder une structure dans laquelle ils peuvent les créer. Lorsque vous utilisez ArcGIS, cette structure doit avoir le même nom que l'utilisateur de la base de données.

Pour effectuer les opérations suivantes, vous pouvez utiliser l'outil Créer un utilisateur de base de données ou un script.

  • Créer ou ajouter un identifiant de connexion à l'instance SQL Server
  • Créer un utilisateur associé à l'identifiant de connexion spécifié
  • Créer une structure correspondante pour l'utilisateur dans la base de données spécifiée
  • Accorder des privilèges à l'utilisateur pour créer des tables, des classes d'entités et des vues dans la base de données spécifiée

Ajouter un utilisateur qui peut créer des données

Vous pouvez exécuter l'outil Créer un utilisateur de base de données à partir d'ArcGIS Desktop ou appeler l'outil dans un script Python pour créer un utilisateur de base de données pouvant créer des tables, des classes d'entités et des vues.

Vous devez être connecté à la base de données via un identifiant de connexion qui détient des privilèges sysadmin sur l'instance SQL Server pour exécuter l'outil Créer un utilisateur de base de données.

Pour créer un utilisateur de base de données pour un identifiant Windows, ce dernier doit exister pour que vous puissiez exécuter l'outil.

Utiliser l'outil Créer un utilisateur de base de données

  1. Démarrez un client ArcGIS Desktop.
  2. Connectez-vous à la base de données ou à la géodatabase avec un identifiant de connexion doté de privilèges sysadmin dans l'instance SQL Server.
  3. Ouvrez l'outil Créer un utilisateur de base de données.

    Il se trouve dans le jeu d'outils Administration de géodatabase de la boîte à outils Gestion des données.

  4. Identifiez la connexion à la base de données pour la Connexion à la base de données en entrée.
  5. Créez un identifiant de connexion authentifié par SQL Server ou utilisez un identifiant de connexion authentifié par Windows existant.
    • Laissez l'option Créer un utilisateur authentifié par le système d'exploitation désélectionnée pour créer un identifiant de connexion authentifié par SQL Server. Par défaut, les instances SQL Server utilisent uniquement l'authentification Windows. Si votre instance n'est pas configurée pour utiliser SQL Server et l'authentification Windows, vous ne pourrez pas choisir d'identifiant de connexion authentifié par la base de données.
    • Sélectionnez l'option Créer un utilisateur authentifié par le système d'exploitation pour utiliser un identifiant de connexion authentifié par Windows.
  6. Attribuez un nom à l'utilisateur de la base de données que l'outil va créer.

    Si vous choisissez de créer un identifiant de connexion authentifié par SQL Server, le nom qui apparaît ici sera également attribué à l'identifiant de connexion.

  7. Saisissez un mot de passe pour l'utilisateur de la base de données.
  8. Si vous disposez déjà d'un rôle de base de données auquel vous souhaitez ajouter cet utilisateur, indiquez le rôle.
  9. Cliquez sur OK (ArcMap) ou sur Exécuter (ArcGIS Pro).

Exécuter un script Python

Pour générer un script de création d'utilisateur, procédez comme suit :

  1. Créez un fichier texte sur l'ordinateur d'un client ArcGIS, puis copiez-y le script suivant.

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

    Vous pouvez exécuter le script à partir d'un ordinateur sur lequel ArcGIS Desktop (Standard ou Advanced), ArcGIS Server (Standard ou Advanced), ou ArcGIS Engine et l'extension Geodatabase Update sont installés.

  2. Enregistrez le fichier avec l'extension .py.
  3. Exécutez le script en indiquant des options et des informations propres à votre instance SQL Server et à l'utilisateur que vous voulez créer.

    Dans l'exemple suivant, le nom du script est create_database_user.py. Un identifiant de connexion authentifié par SQL Server (gisd_owner) est créé dans l'instance SQL Server ssi5. Un utilisateur et une structure correspondants sont ensuite créés dans la base de données gisdata. L'utilisateur n'est pas ajouté à un rôle.

    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

    Astuce :

    Saisissez -h ou --help à l'invite de commande pour obtenir de l'aide sur la syntaxe.

Votre base de données contient désormais un utilisateur qui peut créer des tables.

Lorsque les jeux de données ont été créés, le propriétaire des données peut accorder aux autres utilisateurs des privilèges sur les jeux de données. Reportez-vous à la rubrique Octroyer et supprimer des privilèges sur le jeu de données pour obtenir des instructions.

Créer des identifiants de connexion et des utilisateurs avec des outils SQL Server

Pour créer un utilisateur possédant des privilèges différents de ceux qui ont été octroyés par l'outil Créer un utilisateur de base de données ou auquel aucun privilège n'a été accordé directement, utilisez des outils SQL Server. Voici certains points à prendre en compte lorsque vous créez vos propres identifiants de connexion et utilisateurs à utiliser avec ArcGIS :

  • Tous les utilisateurs d'une base de données qui vont créer des données doivent posséder une structure dans la base de données. Le nom de cette structure et celui de l'utilisateur doivent être identiques.
  • Vous pouvez accorder un accès à SQL Server à un groupe Windows plutôt qu'à des identifiants Windows individuels pour simplifier la création et la gestion des identifiants de connexion. Tous les membres du groupe Windows peuvent se connecter à SQL Server. Les privilèges accordés à un groupe sur le serveur, la base de données et les jeux de données sont automatiquement appliqués à chaque membre du groupe. Toutefois, vous ne pouvez pas créer une structure unique pour stocker les données créées par les membres de groupe. Chaque membre du groupe qui crée des données dans la géodatabase doit disposer de sa propre structure pour stocker les données. SQL Server crée un utilisateur et une structure dans la base de données lorsqu'un membre du groupe génère des données pour la première fois. Cet événement est automatique ; ne créez aucune structure et aucun utilisateur manuellement.

Pour savoir comment utiliser les outils SQL Server pour créer des identifiants de connexion, des utilisateurs et des structures, consultez la documentation Microsoft SQL Server.