No hay nada como PostgreSQL set search_path
en 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;
/
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 ?