2010-10-08 4 views
4

Considérons le scénario suivant ....Comment puis-je créer un lien de base de données en lecture seule dans Oracle

J'ai un utilisateur maître MASTER.

J'ai un test utilisateur TEST.

Pour les deux utilisateurs, la structure de la table est la même. Les deux utilisateurs peuvent être sur différents serveurs Oracle.

puis-je créer un lien de base de données comme master_link en se connectant en tant qu'utilisateur test pour SQL Plus en utilisant la commande suivante

CREATE DATABASE LINK master_link CONNECT TO MASTER IDENTIFIE PAR mot de passe UTILISANT (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP) (HOST = 192.168.9.139) (PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = orcl)))

Par loggin en tant qu'utilisateur d'essai et en utilisant le nom du lien de base de données i peut modifier le tables dans l'utilisateur principal. par exemple

mise à jour table1 @ master_link set display_title = 'PONDS';

Cette requête met à jour la table table1 de l'utilisateur principal. Mon exigence est que je veux donner une autorisation en lecture seule au lien de base de données (lien_maître) afin que l'utilisateur de test ne puisse pas modifier ou insérer dans une table dans l'utilisateur principal en utilisant le lien de base de données.

Répondre

4

Quelle que soit la base de données du schéma MASTER, vous devez créer un nouvel utilisateur (c'est-à-dire MASTER_READ_ONLY). Accordez l'accès SELECT de l'utilisateur MASTER_READ_ONLY sur toutes les tables de MASTER (probablement via un rôle). Vous pouvez éventuellement créer des synonymes publics ou des synonymes privés dans le schéma MASTER_READ_ONLY référençant les objets dans MASTER. Ensuite, lorsque vous créez le lien de base de données, utilisez le compte MASTER_READ_ONLY plutôt que le compte MASTER.

Quelque chose comme

En tant que DBA

CREATE USER master_read_only 
    IDENTIFIED BY password2; 

GRANT create session, create synonym 
    TO master_read_only; 

CREATE ROLE master_ro_role; 

GRANT master_ro_role 
    TO master_read_only; 

Comme MASTER

BEGIN 
    FOR x IN (SELECT * FROM user_tables) 
    LOOP 
    EXECUTE IMMEDIATE 
     'GRANT SELECT ON master.' || x.table_name || 
     ' TO master_ro_role'; 
    END LOOP; 
END; 

Comme MASTER_READ_ONLY

BEGIN 
    FOR x IN (SELECT * FROM all_tables WHERE owner='MASTER') 
    LOOP 
    EXECUTE IMMEDIATE 
     'CREATE SYNONYM ' || x.table_name || 
     ' FOR master.' || x.table_name; 
    END LOOP; 
END; 

Sur la base de données où l'utilisateur TEST a été créé

CREATE DATABASE LINK master_link 
    CONNECT TO master_read_only 
    IDENTIFIED BY password2 
    USING (DESCRIPTION = 
      (ADDRESS_LIST = 
      (ADDRESS = 
       (PROTOCOL = TCP) 
       (HOST =192.168.9.139) 
       (PORT = 1521))) 
      (CONNECT_DATA = (SERVICE_NAME = orcl))) 
+1

ont d'autres options i? Je ne veux pas créer un nouvel utilisateur master_read_only. Est-ce que je peux y arriver uniquement par maître et utilisateur de test – ponds

+0

Comme le souligne Alex, vous pouvez créer un nouvel utilisateur sur la base de données locale, créer le lien de base de données en tant que lien privé dans ce nouveau schéma, créer des vues dans le nouveau schéma local tables distantes, puis accorder à l'utilisateur de test local un accès SELECT sur ces vues. Cela n'est pas aussi sûr que de créer un utilisateur en lecture seule dans la base de données master car le nouvel utilisateur de la base de données locale aura un accès complet aux objets du schéma maître. –

+0

@Justin: vrai, mais l'utilisateur de test n'aura pas un accès complet au maître qui semble être le point principal. Personne, sauf @ponds, ne doit pouvoir se connecter en tant qu'utilisateur propriétaire du lien, et il doit connaître les informations d'identification du maître pour créer le lien qui ne comporte pas beaucoup de risques (à condition que l'utilisateur soit ensuite utilisé pour d'autres choses aussi, ou partagées par la suite). Je suis d'accord que c'est moins satisfaisant si * 8-) –

2

Si vous vous connectez en tant qu'utilisateur master, toute personne utilisant le lien a les privilèges de cet utilisateur sur la base de données distante. Pour isoler ceci, vous pouvez créer un nouvel utilisateur sur l'instance qui a le schéma master, donner à cet utilisateur la sélection des privs sur les tables (sélectionnées) master, et construire votre lien de base de données en utilisant l'utilisateur en lecture seule.

(je suppose que vous n'avez pas update any table accordé à public sur l'instance maître ...)


Sinon, si vous n'êtes pas en mesure de créer un nouvel utilisateur sur l'instance maître, vous pouvez créer un nouvel utilisateur sur l'instance de test à la place. Si vous créez le lien de base de données dans le schéma de ce nouvel utilisateur, vous pouvez créer des vues en lecture seule en utilisant le lien auquel votre utilisateur test peut accéder sans exposer le lien de base de données lui-même. Cela peut être plus compliqué pour quelqu'un de venir plus tard pour suivre ce qui se passe, mais c'est une option.

Questions connexes