2010-09-08 8 views

Répondre

1

Oracle ne fonctionne pas de cette façon. Vous devrez accorder CREATE ANY [OBJECT_TYPE] à cet utilisateur et avoir un déclencheur d'événement système qui les empêche de travailler dans les schémas que vous ne voulez pas.

Avertissement: Les fonctionnalités non documentées/sous-documentées de DBMS_STANDARD sont utilisées.

CREATE OR REPLACE TRIGGER schema_1_on_schema_2 
    before DDL on DATABASE 
as 
    has_dba_priv number; 
    n   number; 
    stmt   ora_name_list_t; 
BEGIN 
    -- exit if user is object owner 
    if ora_dict_obj_owner = ora_login_user then 
    return 
    end if; 

    -- exit if user has dba directly 
    select count(*) 
    into has_dba_priv 
    from dba_role_privs 
    where granted_role = 'DBA' 
    and grantee = ora_login_user; 

    if has_dba_priv <> 0 then 
    return; 
    end if; 

    -- exit if action is an automatic recompile 
    stmt := null; 
    n := ora_sql_txt(sql_text); 
    FOR i IN 1..n LOOP 
    stmt := stmt || sql_text(i); 
    END LOOP; 

    if stmt like 'ALTER % COMPILE REUSE SETTINGS%' then 
    return; 
    end if; 

    -- you should probably organize this into a database table of permitted 
    -- schema_x can affect schema_y, but this is a "basic" example 
    if  (ora_dict_obj_owner = 'SCHEMA_2') 
    and (ora_login_user = 'SCHEMA_1') then 
    null; 
    else 
    raise_application_error (-20000, 'User ' || ora_login_user || 
     ' is not permitted to execute DDL against ' || ora_dict_obj_owner); 
    end if; 
end; 
1

Une meilleure façon peut-être d'intégrer le DDL schema_2 dans les procédures et donner exécution sur les procédures à schema_1. Une explication plus complète de vos besoins peut conduire à des réponses plus complètes/meilleures.

+0

Cette approche échoue avec «privilèges insuffisants», même de l'utilisateur local seulement si je spécifie le 'AUTHID 'à' CURRNET_USER 'fonctionne très bien mais avec' DEFINER 'pas. J'exécute DDL j'ai utilisé 'execute immediate'. –

Questions connexes