¿Cómo configurar el esquema predeterminado de un usuario de Oracle?

12

Creé algunos nuevos usuarios en Oracle. Sin embargo, cuando ejecutan sqlplus, todos necesitan calificar completamente los nombres de las tablas en la consulta. ¿Cuál es la mejor manera de establecer un esquema predeterminado para estos nuevos usuarios?

un caballo sin nombre
fuente

Respuestas:

19

No hay nada como PostgreSQL set search_pathen Oracle.

Lo más parecido que se me ocurre sería un inicio de sesión para el usuario que ejecuta un ALTER SESSION SET CURRENT_SCHEMA ...

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON SCHEMA
BEGIN
     EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
EXCEPTION 
  when others 
    then null; -- prevent a login failure due to an exception
END;
/  

Si la lista de usuarios no es demasiado larga, puede crear un activador de inicio de sesión en la base de datos para que no tenga que crear ese activador para cada usuario:

CREATE OR REPLACE TRIGGER LOGON_TRG 
  AFTER LOGON ON DATABASE
BEGIN
    if (user in ('TOM', 'DICK', 'HARRY')) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
  when others 
    then null; -- prevent a login failure due to an exception
END logon_trg;
/  

Por supuesto, la lista de usuarios donde desea cambiar el esquema predeterminado también se puede tomar de una tabla. En ese caso, solo necesita insertar o eliminar filas desde allí para "activar" esta función (en lugar de volver a crear el activador cada vez).

Otra opción sería crear sinónimos cada vez que cree un usuario que apunte a las tablas reales. Puede automatizar eso mediante un procedimiento almacenado que recorre todas las tablas en un esquema y crea los sinónimos para ellas en el otro esquema.

A menos que todos sus usuarios de Oracle trabajen en las mismas tablas, le recomendaría encarecidamente que no use sinónimos públicos que tendría que crear solo una vez; pueden causar muchos problemas si existen diferentes usuarios de aplicaciones en su instalación.

Editar :

Siguiendo la sugerencia de Alex, aquí hay un inicio de sesión que verifica el rol en lugar de un nombre de usuario:

CREATE OR REPLACE TRIGGER LOGON_TRG
  AFTER LOGON ON DATABASE
declare
  has_role boolean;
BEGIN

    has_role := dbms_session.is_role_enabled('FOOBAR_ROLE');

    if (has_role) then
      EXECUTE IMMEDIATE 'ALTER SESSION SET CURRENT_SCHEMA = foobar';
    end if;
exception 
   when others 
      then null; -- prevent a login failure due to an exception    
END logon_trg;
/
un caballo sin nombre
fuente
Gran idea, pero como when others then null;es un problema general, complicará la solución de problemas ya que hace que cualquier error sea invisible. ¿Quizás elimine el manejo de excepciones por completo o registre el error en el servidor en una transacción AUTÓNOMA y luego vuelva a SUBIRLO ?
George3
@ George3: pero si se lanza la excepción, el usuario no puede iniciar sesión, solo quería evitar que alguien no pueda iniciar sesión solo por un error estúpido en el disparador. Pero cualquiera es libre de adaptar esto a lo que quiera.
a_horse_with_no_name
0

No creo que haya una manera de establecer uno. El usuario es el esquema. AFAIK solo puede establecer el espacio de tabla predeterminado.

cljk
fuente