Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Oracle »

¿Privilegios necesarios para insert en una tabla con propietario diferente?

Estas en el tema de ¿Privilegios necesarios para insert en una tabla con propietario diferente? en el foro de Oracle en Foros del Web. Hola, Estoy intentando ejecutar un procedimiento utilizando un usuario distinto al propietario de una tabla donde se van a hacer borrados e inserciones. El problema ...
  #1 (permalink)  
Antiguo 22/11/2007, 06:19
 
Fecha de Ingreso: junio-2007
Mensajes: 13
Antigüedad: 16 años, 10 meses
Puntos: 0
¿Privilegios necesarios para insert en una tabla con propietario diferente?

Hola,

Estoy intentando ejecutar un procedimiento utilizando un usuario distinto al propietario de una tabla donde se van a hacer borrados e inserciones. El problema es que ejecuto el procedimiento y no inserta nada en la tabla (si lo hago sobre una tabla idéntica del usuario que utilizo, sí lo hace). Le he dado permisos de insert, delete, select, update... a esa tabla para este usuario, pero sigue sin hacer nada.

Lo cierto es que soy relativamente nuevo en Oracle y no tengo nada claro el tema de cómo van los permisos, ¿qué estoy haciendo mal?

Gracias por anticipado.
  #2 (permalink)  
Antiguo 22/11/2007, 08:22
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

Hola,

Mira el follon que se arma ahora, para ver si entiendo bien el escenario, donde estan los objetos y quien ejecuta que,

Usuario1.Tabla_destino
Usuario1.Procedimiento_de_insert_sobre_Tabla_desti no

Usuario2.Ejecuta_el_Procedimiento_de_insert_sobre_ Tabla_destino

Si este es el escenario, solo necesitas dar permisos de ejecucion a Usuario2 sobre el Procedimiento_de_insert_sobre_Tabla_destino.

Ahora, si

Usuario1.Tabla_destino

Usuario2.Procedimiento_de_insert_sobre_Tabla_desti no
Usuario2.Ejecuta_el_Procedimiento_de_insert_sobre_ Tabla_destino

Y, si el Procedimiento_de_insert_sobre_Tabla_destino no esta compilado, es decir en estado invalido, entoces pueden pasar dos cosas:

1. El Usuario2 no tiene permisos de insert sobre Tabla_destino.
2. El Usuario2 tiene permisos de insert sobre Tabla_destino, pero lo tiene a treves de un ROL, en este caso no va a funcionar porque Oracle valida los permisos en tiempo de compilacion y no en tiempo de ejecucion, y como los ROLES pueden cambiar, no da al procedimiento como valido y no lo compila.

Por ultimo, si el procedimiento esta compilado, es decir en estado valido, entoces pueden pasar dos cosas:

1. El Usuario2 no tiene permisos de insert sobre Tabla_destino, y el sql que inserta los datos esta dentro de un SQL dinamico y por eso compila, pero cuando lo ejecutes debe levantar una exception por privilegios insuficientes.
2. El Usuario2 tiene permisos de insert sobre Tabla_destino, pero no inserta nada por alguna razon de logica en el codigo del procedimiento :)

Lo mejor sera postear quien es propietarios de que, quien ejecuta y ver el codigo del procedimiento tambien puede ayudar.

Saludos
  #3 (permalink)  
Antiguo 22/11/2007, 08:51
 
Fecha de Ingreso: junio-2007
Mensajes: 13
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

Vaya! Sí que te has molestado en responder, muchísimas gracias!! Te pongo en situación, que está claro que antes no me he explicado bien:

1.- Tengo un Usuario1.Tabla_Destino.
2.- Tengo un Usuario2.Tabla_ConTriggerX.
3.- Tengo el TriggerX que ejecuta el procedimiento tal que así:
CREATE OR REPLACE TRIGGER Usuario2.ACTUALIZAR
AFTER DELETE OR INSERT OR UPDATE
OF CAMPOAFECTADO
ON Usuario2.Tabla_ConTriggerX
REFERENCING NEW AS NEW OLD AS OLD
BEGIN
Usuario2.ProcedimientoQueActualizaTabla_Destino;
END;
4.- Tengo el Usuario2.ProcedimientoQueActualizaTabla_Destino que, para simplificar muuuucho, hace algo así:
INSERT INTO Usuario1.Tabla_Destino SELECT * FROM Usuario2.Tabla_ConTriggerX
5.- En la Tabla_Destino he asignado permisos de INSERT, SELECT, UPDATE, DELETE para Usuario2 (grantor Usuario1).

El procedimiento te puedo decir que está bien, ya que si el INSERT le digo que me lo haga en una réplica de Tabla_Destino pero como propietario Usuario2 (INSERT INTO Usuario2.Tabla_Destino SELECT ...), lo hace bien.

El procedimiento está compilado correctamente. Yo por lo que veo es el caso 2 que has sugerido, pero en el tema roles me pierdo un poco y no sé si puede ser este el problema, aunque en principio diría que no.

¿Qué opinas? De nuevo muchas gracias por tu ayuda, llevo todo el día con esto y no termino de sacarlo.
  #4 (permalink)  
Antiguo 22/11/2007, 09:42
 
Fecha de Ingreso: junio-2007
Mensajes: 13
Antigüedad: 16 años, 10 meses
Puntos: 0
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

SOLUCIONADO.

He leido en un post algo relacionado con este tema y decían que había que crear el procedimiento con authid_current_user:

create procedure ACTUALIZAR authid current_user as
...

Y ha funcionado, ya escribe correctamente en Tabla_Destino. Pero si os soy sincero, no sé cuáles son los motivos, pues no conocía el authid_current_user (ya os digo que de Oracle poquita cosa). Tendré que buscarme un buen manual y ponerme a estudiar.

matanga, muchas gracias por la ayuda, con gente como tú da gusto.
  #5 (permalink)  
Antiguo 22/11/2007, 09:43
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

Hola,

Yo veo todo bien, solo algunas cosas a tener en cuenta,

Esto es asi, es decir antepones el nombre del usuario antes de la tabla (Usuario1.Tabla_Destino) o puede ser que exista algun sinonimo y que los datos se esten insertando en alguna otro lado.

Que operacion dispara el trigger?, si es un delete sobre Tabla_ConTriggerX, obviamente no se insertaran datos en Tabla_Destino

En que momento haces commit?, recuerda que los commits no se pueden hacer dentro del ambito del trigger, es posible que estes validando los datos de Tabla_Destino desde otra sesion?

Puedes hacer un debug sobre el ProcedimientoQueActualizaTabla_Destino? y ver si efectivamente entra al bloque de codigo que inserta los datos en Tabla_Destino.

Otra cosa es poner el siguiente codigo despues de la sentencia de insert

Código:
INSERT INTO Usuario1.Tabla_Destino SELECT * FROM Usuario2.Tabla_ConTriggerX;
dbms_output.put_line(SQL%ROWCOUNT);
Para ver cuantos registros se han insertado, recuerda de habilitar el serveroutput para poder ver la salida de dbms_output en la herramienta de base de datos que estes utilizando.

Saludos
  #6 (permalink)  
Antiguo 22/11/2007, 09:51
Avatar de matanga  
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 16 años, 6 meses
Puntos: 85
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

Hola,

La idea es que un procedimiento se puede ejecutar con los privilegios de quien lo llama, authid current_user, o bien con los privilegios del propietario del procedimiento, authid definer.

Habra que revisar los privilegios de los dos usuarios, Usuario1 y Usuario2

Saludos
  #7 (permalink)  
Antiguo 22/11/2007, 09:54
 
Fecha de Ingreso: junio-2007
Mensajes: 891
Antigüedad: 16 años, 10 meses
Puntos: 43
Re: ¿Privilegios necesarios para insert en una tabla con propietario diferente?

Creo que te confundes.
EL AUTHID CURRENT USER es para ejecutar el paquete con los permisos que tenga el usuario llamante. No creo que tenga nada que ver eso pa solucionar tu tema.

A ver: Está el USER A que tiene el PAQUETE A que inserta en TABLA A y se le antoja que el USER B haga lo mismo : ejecutar PAQUETE A que inserta en TABLA A .

Pues fijate que facil :

CONNECT USER_A/PASSW_USER_A@BBDD_USER_A

GRANT EXECUTE ON PAQUETE_A TO USER_B

CONNECT USER_B/PASSW_USER_B@BBDD_USER_B

CREATE SYNONYM USER_B.PAQUETE_A FOR USER_A.PAQUETE_A

EXECUTE PAQUETE_A;


Y a tirar millas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:28.