首页 > 代码库 > Oracle下用户对象的迁移,包(package),表,试图,序列

Oracle下用户对象的迁移,包(package),表,试图,序列

问题:       在开发系统时候,有时我们希望能够限制前端页面对数据库的访问行为,比如在Oracle数据库当中,我们采用A用户创建数据库的表结构,package,视图,序列,因此A用户具有访问这些对象的所有权限,

          如果前端页面是另一个团队(BTeam)开发,另一个团队对数据库的表结构了解不够熟悉,为了防止BTeam错误的操作导致数据的混乱,我们为BTeam用户创建一个用户B,BTeam通过用户B来访问A用户下

          创建的对象,由于BTeam通过B用户来访问数据库,此时在数据库层面可以限制B用户的访问权限,从而在一定程度上防止BTeam错误的操作导致数据库中数据的混乱。

                此时开发一个较大的系统时,A用户下可能会存在很多对象,那么如果把A用户的对象批量的授权给B用户呢? 脚本如下

        

--授权并创建同义词 declare       CURSOR c_tabname is         SELECT object_name FROM user_objects           where object_type   in(TABLE);       v_tabname dba_tables.table_name%TYPE;       sqlstr    VARCHAR2(200);             CURSOR c_package IS          SELECT object_name FROM user_objects           where object_type   in(PACKAGE);       r_package c_package%ROWTYPE;            CURSOR c_view_seq IS        SELECT object_name FROM user_objects           where object_type   in(VIEW,SEQUENCE);                r_view_seq  c_view_seq%ROWTYPE;            CURSOR c_synonym IS        select  create public synonym ||OBJECT_NAME|| for userA.||OBJECT_NAME||;  syn_create,                drop  public synonym ||OBJECT_NAME   syn_drop                       from user_objects           where object_type             in(TABLE,VIEW,PROCEDURE,SEQUENCE,PACKAGE);                   r_syn c_synonym%ROWTYPE;           begin      open c_tabname;      loop         fetch c_tabname         into v_tabname;         exit when c_tabname%NOTFOUND;         sqlstr := grant select, update, insert on userA. || v_tabname ||                 to userB;;         dbms_output.put_line(sqlstr);        execute immediate sqlstr;            end loop;    close c_tabname;        FOR r_package IN c_package LOOP       sqlstr := grant execute on userA. || r_package.object_name ||                 to userB;;         dbms_output.put_line(sqlstr);         execute immediate sqlstr;              END LOOP;      dbms_output.put_line(视图和序列);   FOR r_view_seq IN c_view_seq LOOP       sqlstr := grant select on userA. || r_view_seq.object_name ||                 to userB;;         dbms_output.put_line(sqlstr);         execute immediate sqlstr;                  END LOOP;   --创建同义词   dbms_output.put_line(创建同义词!);   FOR r_syn IN c_synonym LOOP           BEGIN      sqlstr := r_syn.syn_drop;      dbms_output.put_line(sqlstr);            EXECUTE IMMEDIATE sqlstr;           sqlstr := r_syn.syn_create;      dbms_output.put_line(sqlstr);            EXECUTE IMMEDIATE sqlstr;       EXCEPTION       WHEN OTHERS THEN          NULL;     END ;         END LOOP;     END;

 

Oracle下用户对象的迁移,包(package),表,试图,序列