Agregar nombres de usuario y usuarios a SQL Server

En Microsoft SQL Server, los administradores de base de datos agregan nombres de usuario a la instancia de SQL Server y estos se asignan a usuarios de bases de datos individuales en la instancia de SQL Server. Los usuarios de la base de datos que creen tablas y clases de entidad deben tener los privilegios necesarios para crear estos objetos en la base de datos y un esquema donde puedan hacerlo. Al usar ArcGIS, ese esquema debe tener el mismo nombre que el usuario de la base de datos.

Puede usar la herramienta Crear usuario de base de datos o un script para hacer todo lo siguiente:

  • Cree o agregue un nombre de usuario a la instancia de SQL Server.
  • Cree un usuario asignado al nombre de usuario especificado.
  • Cree un esquema de geocodificación para el usuario en la base de datos que especifique.
  • Otorgue privilegios suficientes al usuario para crear tablas, clases de entidad y vistas en la base de datos especificada.

Agregar un usuario que puede crear 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. Esta herramienta requiere una licencia Standard o Advanced para ejecutarla.

Debe conectarse a la base de datos con un nombre de usuario que tenga privilegios sysadmin en la instancia de SQL Server para ejecutar la herramienta Crear usuario de base de datos.

Si desea crear un usuario de la base de datos para un nombre de usuario de Microsoft Windows, el nombre de usuario ya debe existir antes de ejecutar la herramienta.

Utilice la herramienta Crear usuario de base de datos

  1. Conéctese a la base de datos o geodatabase con un nombre de usuario que tenga privilegios sysadmin en la instancia de SQL Server.
  2. 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.

  3. Especifique la conexión de base de datos de Conexión de la base de datos de entrada.
  4. Elija si desea crear un nombre de usuario autenticado de SQL Server o usar un nombre de usuario autenticado de Windows existente.
    • Deje Crear un usuario autenticado del sistema operativo desactivado para crear un nombre de usuario autenticado de SQL Server. Tenga en cuenta que, de forma predeterminada, las instancias de SQL Server usan solo la autenticación de Windows. Si su instancia no está configurada para usar la autenticación de SQL Server y Windows, no podrá crear un nombre de usuario autenticado de la base de datos.
    • Marque Crear un usuario autenticado del sistema operativo para usar un nombre de usuario autenticado de Windows existente.
  5. Escriba el nombre del usuario de la base de datos que la herramienta creará.

    Si elige crear un nombre de usuario autenticado de SQL Server, el nombre que escriba aquí también se usará para el inicio de sesión.

  6. Escriba una contraseña para el usuario de la base de datos.
  7. Si ya tiene un rol de base de datos al que desea agregar este usuario, especifique dicho rol.

Ejecutar un script de Python

Para crear usuarios mediante una secuencia de comandos, siga estos pasos:

  1. Cree un archivo de texto en un equipo cliente de ArcGIS y copie en él la secuencia de comandos 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)

  2. Guarde el archivo con una extensión .py.
  3. Ejecute el script; proporcione opciones e información específicas de su instancia de SQL Server y el usuario que desea crear.

    En el siguiente ejemplo, el nombre del script es create_database_user.py. En la instancia de SQL Server, ssi5, se crea un inicio de sesión autenticado de SQL Server (gisd_owner) y, en la base de datos, gisdata, se crean el usuario y el esquema correspondientes. El usuario no se agrega a un rol.

    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

    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.

Cuando existan los datasets, el propietario de los datos puede otorgar privilegios sobre los datasets a otros usuarios. Consulte Otorgar y revocar privilegios sobre datasets para obtener instrucciones.

Crear nombres de usuario y usuarios con las herramientas de SQL Server

Si desea crear un usuario con privilegios distintos de los otorgados por la herramienta Crear usuario de base de datos o sin privilegios otorgados directamente al usuario, puede usar las herramientas de SQL Server para hacerlo. Hay algunos aspectos a tener en cuenta cuando crea sus propios nombres de usuario y usuarios para usarlos con ArcGIS:

  • Todos los usuarios de la base de datos que creen datos deben tener un esquema en la base de datos. El nombre del esquema debe coincidir con el nombre de usuario.
  • Puede otorgar a un grupo de Windows acceso a SQL Server en lugar de inicios de sesión individuales de Windows, lo que simplifica la creación y administración de los inicios de sesión. Todos los miembros del grupo de Windows pueden iniciar sesión en SQL Server. Los privilegios sobre servidores, bases de datos y datasets otorgados al grupo se aplican automáticamente a todos sus miembros. Sin embargo, tenga en cuenta que no puede crear un esquema para almacenar los datos creados por todos los miembros del grupo. Cada usuario del grupo que crea datos en la geodatabase debe tener su propio esquema en el que almacena los datos. SQL Server crea un usuario y un esquema en la base de datos la primera vez que un miembro del grupo crea datos. Esto ocurre automáticamente; no cree un esquema y usuario manualmente.

Para obtener instrucciones sobre el uso de las herramientas de SQL Server para crear nombres de usuario, usuarios y esquemas, consulte la documentación de Microsoft SQL Server.