Ajouter des utilisateurs à Oracle

Les administrateurs de bases de données Oracle créent des comptes utilisateurs dans l’instance Oracle et leur affectent du stockage (tablespaces) et des privilèges.

L’administrateur de base de données (utilisateur sys) peut utiliser des outils Oracle pour créer des utilisateurs et un tablespace par défaut pour l’utilisateur, et accorder des privilèges pour créer des objets de base de données.

L’administrateur de base de données peut également utiliser l’outil Créer un utilisateur de base de données ou un script d’un client ArcGIS client pour créer un utilisateur qui possède des données. Cet outil requiert une licence Standard ou Advanced. Les utilisateurs de base de données créés avec cet outil détiennent les privilèges suivants :

  • CREATE SESSION
  • CREATE SEQUENCE
  • CREATE TABLE
  • CREATE TRIGGER
  • CREATE VIEW
  • SELECT ON DBA_ROLES

Ajouter un utilisateur qui peut créer des objets de base de 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, des vues, des déclencheurs et des séquences.

Vous devez être connecté à la base de données en tant qu’utilisateur sys Oracle pour exécuter l’outil Créer un utilisateur de base de données.

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

  1. Connectez-vous à la base de données ou la géodatabase en tant qu'utilisateur sys.
  2. 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.

  3. Identifiez la connexion à la base de données pour la Connexion à la base de données en entrée.
  4. Attribuez un nom à l'utilisateur et à la structure que l'outil va créer.
  5. Saisissez un mot de passe pour l'utilisateur de la base de données.
  6. Si vous disposez déjà d'un rôle de groupe auquel vous souhaitez ajouter cet utilisateur en tant que membre, indiquez le rôle.
  7. Saisissez le nom du tablespace par défaut de l'utilisateur. Si le tablespace n’existe pas déjà, il sera créé par l’outil dans l’emplacement de stockage par défaut de Oracle. L'outil crée un tablespace de 400 Mo.

    Si vous ne spécifiez aucun tablespace, le tablespace par défaut de Oracle est utilisé.

  8. Cliquez sur OK (ArcMap) ou sur Run (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 un ordinateur sur lequel le client ArcGIS est installé, 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)

  2. Enregistrez le fichier avec l’extension .py.
  3. Exécutez le script en indiquant les options et les informations propres à votre base de données Oracle et à l’utilisateur que vous voulez créer.

    Dans l’exemple suivant, exécuté sur un serveur Microsoft Windows, le nom du script est create_database_user.py. Un utilisateur authentifié de base de données (géodonnées) est créé dans la base de données à l’aide de la chaîne de connexion Oracle, dbsrv/orcl. L'utilisateur n'est pas ajouté à un rôle.

    create_database_user.py --DBMS ORACLE -i dbsrv/orcl -U sys -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t

    Voici un exemple d’exécution du script sur un ordinateur Linux :

    ./create_database_user.py --DBMS ORACLE -i dbsrv/orcl -U sys -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t

    Conseil :

    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 existent, le propriétaire peut accorder des privilèges SELECT sur ces derniers aux utilisateurs qui doivent afficher les données, et des privilèges SELECT, INSERT, UPDATE et DELETE sur les jeux de données aux utilisateurs devant mettre à jour les 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 utilisateurs avec des outils Oracle

Pour créer un utilisateur de base de données 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 Oracle.

Pour savoir comment utiliser les outils Oracle afin de créer des utilisateurs de bases de données, consultez la documentation Oracle.