Disponible con una licencia Standard o Advanced.
PostgreSQL utiliza roles para iniciar la sesión en el clúster de bases de datos y en las bases de datos. Los usuarios individuales se denominan roles de inicio de sesión. Para todos los roles de inicio de sesión que serán propietarios de objetos en la geodatabase, también debe crear un esquema en esa base de datos. Para usar PostgreSQL con ArcGIS, el esquema debe tener el mismo nombre que el rol de inicio de sesión y ser propiedad de este.
Puede usar la herramienta Crear usuario de base de datos para agregar un rol de inicio de sesión que pueda crear tablas y clases de entidad. La herramienta crea un rol de inicio de sesión en el clúster de base de datos de PostgreSQL, crea un esquema de geocodificación para el usuario en la base de datos que especifique y otorga privilegios usage sobre el nuevo esquema al público.
Si desea crear un rol de inicio de sesión que no posea un esquema y que, por lo tanto, no pueda crear objetos en la geodatabase, puede usar una aplicación cliente de PostgreSQL como pgAdmin o PL/pgSQL para crear un rol en el clúster de base de datos de PostgreSQL.
También puede crear grupos de roles a los que se pueden agregar roles de inicio de sesión. A continuación, puede especificar permisos para el grupo que se aplicarán a todos los roles de inicio de sesión asociados. Puede usar la herramienta Crear rol o una secuencia de comandos para crear roles de grupo o bien utilizar SQL.
Nota:
Aún así, debe crear un esquema coincidente para cada rol de inicio de sesión que será propietario de objetos en la geodatabase. No se puede crear un esquema para el rol del grupo.
Agregar un usuario que puede crear objetos de base de datos
Puede ejecutar la herramienta Crear usuario de base de datos desde ArcGIS Desktop o invocarla en un script de Python para crear un usuario de la base de datos que puede crear tablas, clases de entidad y vistas.
Debe conectarse a la base de datos mediante un rol con estado de superusuario para ejecutar la herramienta Crear usuario de base de datos.
Utilice la herramienta Crear usuario de base de datos
- Inicie un cliente de ArcGIS Desktop.
- Conéctese a la base de datos o geodatabase mediante un rol con autoridad de superusuario de PostgreSQL.
- Abra la herramienta Crear usuario de base de datos.
La herramienta está en el conjunto de herramientas Administración de geodatabase de la caja de herramientas Administración de datos.
- Especifique la conexión de base de datos de Conexión de la base de datos de entrada.
- Escriba un nombre para el rol de inicio de sesión y el esquema que la herramienta creará.
- Escriba una contraseña para el usuario de la base de datos.
- Si ya tiene un rol del grupo del que desea que este usuario sea miembro, especifique dicho rol.
- Haga clic en Aceptar (ArcMap) o en Ejecutar (ArcGIS Pro).
Ejecutar un script de Python
Para crear usuarios mediante un script, siga estos pasos:
- Cree un archivo de texto en un equipo cliente de ArcGIS y copie en él el script siguiente.
""" 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)
Puede ejecutar el script desde un equipo que tenga instalado ArcGIS Desktop (Standard o Advanced), ArcGIS Server (Standard o Advanced) o ArcGIS Engine con la extensión Geodatabase Update.
- Guarde el archivo con una extensión .py.
- Ejecute el script, proporcionando opciones e información específicas de su clúster de base de datos de PostgreSQL y el rol de inicio de sesión que desea crear.
En el siguiente ejemplo ejecutado desde un servidor de Microsoft Windows, el nombre del script es create_database_user.py. En el clúster de base de datos de PostgreSQL pgdb7 se crea un rol de inicio de sesión autenticado de la base de datos (geodatos) y en la base de datos gisdata se crea el esquema correspondiente. El usuario no se agrega a un rol de grupo.
create_database_user.py --DBMS POSTGRESQL -i pgdb7 -D gisdata -U postgres -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t
Este es un ejemplo de la ejecución del script en un equipo con Linux:
./create_database_user.py --DBMS POSTGRESQL -i pgdb7 -D gisdata -U postgres -P $hHhH --utype DATABASE_USER -u geodata -p 0wn1t
Sugerencia:
Introduzca -h o --help en la ventana de comando para obtener ayuda con la sintaxis.
La base de datos ahora tiene un usuario que puede crear tablas.
Crear nombres de usuario para ver y editar datos
Puede usar SQL para crear roles de inicio de sesión para aquellos usuarios que no crearán datos. No obstante, si lo va a hacer para su geodatabase en PostgreSQL, asegúrese de que el grupo público o el usuario específico tenga privilegios para crear tablas temporales.
También puede crear grupos de inicio de sesión para facilitar la concesión de privilegios sobre datasets individuales a estos usuarios.
Crear roles
En los siguientes pasos se describe cómo usar psql para crear roles de grupo con el fin de simplificar la administración de privilegios de datos y crear roles de inicio de sesión que pertenezcan a los roles de grupo.
- Inicie sesión en psql como usuario con permisos para crear otros roles en el clúster de base de datos. Puede ser un nombre de usuario con estado de superusuario o uno con el privilegio createrole.
- Primero, use el comando create role para crear dos grupos de inicio de sesión: uno para usuarios que pueden editar datasets (editores) y uno para usuarios que solo pueden ver datos (visores).
CREATE ROLE editors NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT; CREATE ROLE viewers NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT;
- A continuación, cree roles de inicio de sesión que sean miembros del grupo de editores.
En este ejemplo se ha creado un rol de inicio de sesión (editor1) con una contraseña cifrada. El rol no tiene estado de superusuario y no puede crear bases de datos ni tampoco roles en el clúster de base de datos. Sin embargo, se ha convertido en miembro de los editores de roles de grupo y heredará privilegios de ese rol de grupo.
Cambie el nombre del rol de inicio de sesión y ejecute la declaración de nuevo para crear roles de inicio de sesión adicionales que podrán editar datos en la geodatabase.CREATE ROLE editor1 LOGIN ENCRYPTED PASSWORD 'sooper.secret' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE editors;
- Ahora, cree roles de inicio de sesión que sean miembros del grupo de visores.
En este ejemplo, se ha creado un rol de inicio de sesión (reader1) con una contraseña cifrada. El rol no tiene estado de superusuario y no puede crear bases de datos ni tampoco roles en el clúster de base de datos. Sin embargo, se ha convertido en miembro de los visores de roles de grupo y heredará privilegios de ese rol de grupo.
Cambie el nombre del rol de inicio de sesión y ejecute la declaración de nuevo para crear roles de inicio de sesión adicionales que solo pueden ver datos en la geodatabase.CREATE ROLE reader1 LOGIN ENCRYPTED PASSWORD 'almostas.secret' NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT IN ROLE viewers;
- Otorgue el privilegio usage sobre el esquema de geodatos a cada uno de los grupos de inicio de sesión.
El privilegio usage permite a los miembros de los grupos de editores y visores acceder a datos del esquema de los geodatos. Sin este, los geodatos no podrían otorgar privilegios sobre datasets individuales a los miembros de los roles de grupo de visores y editores.
GRANT USAGE ON SCHEMA geodata TO editors; GRANT USAGE ON SCHEMA geodata TO viewers;
- Si crea estos inicios de sesión para una geodatabase y modificó los privilegios del esquema sde de manera que el público no tenga usage sobre ella, otorgue privilegio usage sobre el esquema sde a los grupos de editores y visores.
GRANT USAGE ON SCHEMA sde TO editors; GRANT USAGE ON SCHEMA sde TO viewers;
Ahora, su base de datos tiene uno o más usuarios que editarán datos y uno o más usuarios que verán datos.
Una vez que los datasets existen en la base de datos o la geodatabase, el propietario puede otorgar privilegios select sobre los datasets al grupo de visores y privilegios select, insert, update y delete sobre los datasets al grupo de editores. Consulte Otorgar y revocar privilegios sobre datasets para obtener instrucciones.