web-dev-qa-db-fra.com

Comment définir le schéma par défaut d'un utilisateur Oracle?

J'ai créé quelques nouveaux utilisateurs dans Oracle. Cependant, lors de l'exécution de sqlplus, ils doivent tous qualifier complètement les noms de table dans la requête. Quelle est la meilleure façon de définir un schéma par défaut pour ces nouveaux utilisateurs?

12
Will K

Il n'y a rien de tel que le set search_path dans Oracle.

La chose la plus proche à laquelle je peux penser serait un déclencheur de connexion pour l'utilisateur qui exécute 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 liste des utilisateurs n'est pas trop longue, vous pouvez créer un déclencheur de connexion à la base de données afin de ne pas avoir à créer ce déclencheur pour chaque utilisateur:

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;
/  

Bien sûr, la liste des utilisateurs dont vous souhaitez modifier le schéma par défaut peut également être extraite d'une table. Dans ce cas, il vous suffit d'insérer ou de supprimer des lignes à partir de là pour "activer" cette fonctionnalité (plutôt que de recréer le déclencheur à chaque fois).

Une autre option serait de créer des synonymes chaque fois que vous créez un utilisateur qui pointe vers les vraies tables. Vous pouvez automatiser cela à l'aide d'une procédure stockée qui parcourt toutes les tables dans un schéma et crée les synonymes pour elles dans l'autre schéma.

À moins que tous vos utilisateurs Oracle travaillent sur les mêmes tables, je vous déconseille fortement d'utiliser synonymes publics que vous ne devriez créer qu'une seule fois - ils peuvent causer beaucoup de problèmes si différents utilisateurs d'application existent dans votre installation.

Modifier:

Suite à la suggestion d'Alex, voici un déclencheur de connexion qui vérifie le rôle plutôt qu'un nom d'utilisateur:

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;
/
19

Je ne pense pas qu'il existe un moyen d'en définir un. L'utilisateur est le schéma. AFAIK, vous ne pouvez définir que l'espace disque logique par défaut.

0
cljk