quitar privilegios en oracle

Iniciado por d91, 5 Octubre 2015, 04:26 AM

0 Miembros y 1 Visitante están viendo este tema.

d91

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 (vbnet) [Seleccionar]

ORA-01031: insufficient privileges

la linea de codigo que ejecuto en el procedimiento almacenado es este
Código (sql) [Seleccionar]

execute immediate 'Revoke create session FROM '||nombre;

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

0roch1

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 (vbnet) [Seleccionar]

query = "EXECUTE immediate 'Revoke create session FROM '||nombre;"
MsgBox(query)



d91

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 (sql) [Seleccionar]

create or replace procedure usp_quita_priv
(nombre varchar2,
priv1 NUMBER,
priv2 NUMBER,
priv3 NUMBER,
priv4 NUMBER,
proc number,
borrar number,
sesion number
)
is
privilegios varchar2(512);
begin
  if borrar > 0 then
    execute immediate 'Drop user '||nombre||' cascade';
    elsif sesion > 0 then
    execute immediate 'Revoke create session FROM '||nombre;
    END IF;
   
   
      if priv1 > 0 then
        privilegios:='INSERT';
      end if;
 
      if priv2 > 0 and privilegios is not null then
          privilegios:=privilegios||','||' UPDATE';
      end if;

      if priv2 > 0 and privilegios is null then
         privilegios:='UPDATE';
      end if;
   
      if priv3 > 0 and privilegios is not null then
         privilegios:=privilegios||','||' DELETE';
      end if;

      if priv3 > 0 and privilegios is null then
         privilegios:='DELETE';
     end if;
 
      if priv4 > 0  and privilegios is not null then
         privilegios:=privilegios||','||' SELECT';
      end if;

      if priv4> 0 and privilegios is null then
         privilegios:='SELECT';
      end if;
     
       ----------------------------------------
  if privilegios is not null then
  FOR x IN (SELECT table_name nombre FROM user_tables)
LOOP
  ---dbms_output.put_line(x.nombre);
  --EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO <<someone>>';
  --execute immediate 'GRANT '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
    execute immediate 'Revoke '||privilegios||' on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
END LOOP;
end if;

  if proc > 0 then
  FOR x IN (SELECT distinct name nombre, type FROM USER_SOURCE WHERE TYPE IN ('PROCEDURE'))
LOOP
  --execute immediate 'GRANT EXECUTE  on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' to '||usuario_;
  execute immediate  'Revoke execute on '||'"'||user||'"'||'.'||'"'||x.nombre||'"'||' from '||nombre;
END LOOP;

  end if;
           
  ---borrar > 0
end;



0roch1

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 (sql) [Seleccionar]

query varchar2(50);

....

query := 'Revoke create session FROM '||nombre;

dbms_output.put_line(query );