Español

Cómo: Revocar privilegios de base de datos desde las tablas de metadatos de geodatabase de ArcGIS

Resumen

Las instrucciones proporcionadas describen cómo revocar privilegios de INSERT, UPDATE y DELETE de las tablas gdb_* de geodatabase en instancias de geodatabases corporativas de Oracle y SQL*Server (aplicable para ArcGIS 9.x y 10.x).

Al crear una geodatabase, se crea un conjunto de tablas de metadatos de geodatabase llamadas gdb_* en el esquema del administrador (el esquema SDE en Oracle y SQL*Server o el esquema dbo en SQL*Server) y los privilegios de SELECT, INSERT, UPDATE y DELETE se otorgan automáticamente para PUBLIC en cada tabla. Estos privilegios son obligatorios para permitir la creación de clases de objeto, clases de entidad, datasets de entidades, dominios, redes, topologías, replicación, etc., en la geodatabase. Desafortunadamente, los privilegios públicos dan pie a que los usuarios dañen de forma malintencionada una geodatabase con SQL para modificar directamente las tablas.

Para evitar posibles usos indebidos y daños, es posible revocar los privilegios INSERT, UPDATE y DELETE de PUBLIC para las tablas gdb_*. Si los privilegios predeterminados se eliminan de las tablas gdb_* de geodatabase, los usuarios no pueden crear objetos en la geodatabase ni posiblemente realizar tareas fundamentales, por ejemplo, ejecutar diversas herramientas de geoprocesamiento que crean o actualizan la geodatabase.

Antes de revocar privilegios en un entorno de producción, se recomienda probar la aplicación de ArcGIS para identificar y comprender la funcionalidad de geodatabase que no esté disponible para los usuarios sin privilegios de INSERT, UPDATE o DELETE desde las tablas gdb_* de geodatabase.

En caso necesario, el administrador de la geodatabase puede otorgar de manera explícita los privilegios de INSERT, UPDATE y DELETE a usuarios específicos de la base de datos que deban crear y modificar propiedades de la base de datos.

Procedimiento

Los siguientes procedimientos ofrecen ejemplos de cómo revocar los privilegios de INSERT, UPDATE y DELETE de PUBLIC para las tablas gdb_* en Oracle y SQL*Server. Se proporcionan procedimientos adicionales para otorgar privilegios de INSERT, UPDATE y DELETE para PUBLIC en caso de que se deben restaurar los privilegios.
 

A continuación se muestra el procedimiento de Oracle para revocar privilegios de INSERT, UPDATE y DELETE del PUBLIC para las tablas gdb_*. Ejecute el procedimiento como el usuario sde en SQL*Plus.
 

Código:
DECLARE

  CURSOR each_table IS
    SELECT DISTINCT table_name
      FROM user_tab_privs_made
     WHERE table_name LIKE 'GDB_%'
       AND privilege IN ('INSERT','UPDATE','DELETE')
       AND grantee = 'PUBLIC'
  ORDER BY table_name;

BEGIN

  IF USER <> 'SDE' THEN
    RAISE_APPLICATION_ERROR(-20000, 'USER debe ser SDE para ejecutar este procedimiento.');
  END IF;

  FOR each_row IN each_table LOOP
    EXECUTE IMMEDIATE 'REVOKE INSERT, UPDATE, DELETE ON '||each_row.table_name||' FROM PUBLIC'; 
  END LOOP;

END;
/


A continuación se muestra el procedimiento de Oracle para otorgar privilegios de INSERT, UPDATE y DELETE a PUBLIC para las tablas gdb_*. Ejecute el procedimiento como el usuario sde en SQL*Plus.
 
Código:
DECLARE

  CURSOR each_table IS
    SELECT DISTINCT table_name
      FROM user_tab_privs_made
     WHERE table_name LIKE 'GDB_%'
       AND privilege = 'SELECT'
       AND grantee = 'PUBLIC'
  ORDER BY table_name;

BEGIN

  IF USER <> 'SDE' THEN
    RAISE_APPLICATION_ERROR(-20000, 'USER debe ser SDE para ejecutar este procedimiento.');
  END IF;

  FOR each_row IN each_table LOOP
    EXECUTE IMMEDIATE 'GRANT INSERT, UPDATE, DELETE ON '||each_row.table_name||' TO PUBLIC'; 
  END LOOP;

END;
/
 

A continuación se muestra el procedimiento de SQL*Server para revocar privilegios de INSERT, UPDATE y DELETE del PUBLIC para las tablas gdb_*. Ejecute el procedimiento como el usuario sde o dbo en SQL*Server Management Studio.
 

Código:
Declare @TName varchar(100)
Declare @SQLStr varchar (500)

Declare	each_table	cursor
for
	select name from sys.tables where name like 'GDB_%'

open each_table
Fetch each_table into @TName
while (@@fetch_status=0) 
Begin
	set @SQLStr = 	'REVOKE INSERT, UPDATE, DELETE ON ' + @TName + ' FROM PUBLIC cascade'
	exec (@SQLStr)

	Fetch each_table into @TName
End
close each_table
Deallocate each_table


A continuación se muestra el procedimiento de SQL*Server para otorgar privilegios de INSERT, UPDATE y DELETE a PUBLIC para las tablas gdb_*. Ejecute el procedimiento como el usuario sde o dbo en SQL*Server Management Studio.
 
Código:
Declare @TName varchar(100)
Declare @SQLStr varchar (500)

Declare	each_table	cursor
for
	select name from sys.tables where name like 'GDB_%'

open each_table
Fetch each_table into @TName
while (@@fetch_status=0) 
Begin
	set @SQLStr = 	'GRANT INSERT, UPDATE, DELETE ON ' + @TName + ' TO PUBLIC'
	exec (@SQLStr)

	Fetch each_table into @TName
End
close each_table
Deallocate each_table