Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: d91 en 5 Octubre 2015, 04:26 am



Título: quitar privilegios en oracle
Publicado por: d91 en 5 Octubre 2015, 04:26 am
hola, estoy trabajando con oracle desde una aplicacion en .net, desde la app creo un usuario y le doy privilegios, y desde la misma app le tengo que quitar esos privilegios, en la creacion y dar privilegios no hay problema pero al momento de quitarlos da este error
Código
  1. ORA-01031: insufficient privileges
  2.  
la linea de codigo que ejecuto en el procedimiento almacenado es este
Código
  1. EXECUTE immediate 'Revoke create session FROM '||nombre;
  2.  
el privilegio que estoy quitando es para que ya no se pueda conectar a la base de datos, lo unico es que al hacerlo desde la consola no hay problema, aunque lo hago con el mismo usuario que es propietario de algunas tablas y que tiene privilegios de DBA


Título: Re: quitar privilegios en oracle
Publicado por: 0roch1 en 5 Octubre 2015, 18:15 pm
Estás seguro de que "nombre" es el nuevo usuario creado?, muestra el query por pantalla solo para verificar que es el usuario creado al que intentas aplicar los cambios.

Código
  1. query = "EXECUTE immediate 'Revoke create session FROM '||nombre;"
  2. MsgBox(query)
  3.  



Título: Re: quitar privilegios en oracle
Publicado por: d91 en 5 Octubre 2015, 23:39 pm
aqui esta el codigo completo,  las variables priv en la aplicacion son checkbox para saber cuales hay que retirar. El nombre del usuario lo tomo de un dropdownlist que esta lleno con los usuarios que estan activos, y vuelvo a recalcar que desde la consola al realizar el for desde un bloque anonimo si funciona
Código
  1. CREATE OR REPLACE PROCEDURE usp_quita_priv
  2. (nombre varchar2,
  3. priv1 NUMBER,
  4. priv2 NUMBER,
  5. priv3 NUMBER,
  6. priv4 NUMBER,
  7. proc NUMBER,
  8. borrar NUMBER,
  9. sesion NUMBER
  10. )
  11. IS
  12. privilegios varchar2(512);
  13. BEGIN
  14.  IF borrar > 0 THEN
  15.    EXECUTE immediate 'Drop user '||nombre||' cascade';
  16.    elsif sesion > 0 THEN
  17.    EXECUTE immediate 'Revoke create session FROM '||nombre;
  18.    END IF;
  19.  
  20.  
  21.      IF priv1 > 0 THEN
  22.        privilegios:='INSERT';
  23.      END IF;
  24.  
  25.      IF priv2 > 0 AND privilegios IS NOT NULL THEN
  26.          privilegios:=privilegios||','||' UPDATE';
  27.      END IF;
  28.  
  29.      IF priv2 > 0 AND privilegios IS NULL THEN
  30.         privilegios:='UPDATE';
  31.      END IF;
  32.  
  33.      IF priv3 > 0 AND privilegios IS NOT NULL THEN
  34.         privilegios:=privilegios||','||' DELETE';
  35.      END IF;
  36.  
  37.      IF priv3 > 0 AND privilegios IS NULL THEN
  38.         privilegios:='DELETE';
  39.     END IF;
  40.  
  41.      IF priv4 > 0  AND privilegios IS NOT NULL THEN
  42.         privilegios:=privilegios||','||' SELECT';
  43.      END IF;
  44.  
  45.      IF priv4> 0 AND privilegios IS NULL THEN
  46.         privilegios:='SELECT';
  47.      END IF;
  48.  
  49.       ----------------------------------------
  50.  IF privilegios IS NOT NULL THEN
  51.  FOR x IN (SELECT TABLE_NAME nombre FROM user_tables)
  52. LOOP
  53.  ---dbms_output.put_line(x.nombre);
  54.  --EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO <<someone>>';
  55.  --execute immediate 'GRANT '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
  56.    EXECUTE immediate 'Revoke '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
  57. END LOOP;
  58. END IF;
  59.  
  60.  IF proc > 0 THEN
  61.  FOR x IN (SELECT DISTINCT name nombre, TYPE FROM USER_SOURCE WHERE TYPE IN ('PROCEDURE'))
  62. LOOP
  63.  --execute immediate 'GRANT EXECUTE  on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
  64.  EXECUTE immediate  'Revoke execute on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
  65. END LOOP;
  66.  
  67.  END IF;
  68.  
  69.  ---borrar > 0
  70. END;
  71.  
  72.  
  73.  


Título: Re: quitar privilegios en oracle
Publicado por: 0roch1 en 6 Octubre 2015, 16:45 pm
Entiendo

Es para la única instrucción en donde no te permite hacer el cambio?.

Me sigue causando duda la variable nombre, pienso que posiblemente estás tratando de aplicar el query al actual usuario.
Puedes imprimirla solo para verificarla.

Código
  1. query varchar2(50);
  2.  
  3. ....
  4.  
  5. query := 'Revoke create session FROM '||nombre;
  6.  
  7. dbms_output.put_line(query );
  8.  
  9.