在Oracle中更改包时,Replace over Drop的优点是什么?

时间:2017-05-14 04:55:00

标签: oracle plsql

create or replace packagedrop上使用create更改Oracle PL / SQL中的包有什么好处?

3 个答案:

答案 0 :(得分:2)

用户"A"有一个包pkg_tst。他们已经将权限授予其他用户," B"。他们还有一个程序p1,这取决于包。

SQL> select * from user_tab_privs made where table_name = 'PKG_TST';

GRANTEE OWNER   TABLE_NAME GRANTOR PRIVILE GRA HIE
------- ------- ---------- ------- ------- --- ---
B       A       PKG_TST    A       EXECUTE NO  NO

SQL> select status from user_objects where object_name = 'P1';

STATUS
-------
VALID

SQL>

现在,如果用户"A"重新创建包,则任何授权仍然存在且依赖关系仍然有效(感谢Fine-grained dependency management!)

SQL> create or replace package pkg_tst as
  2    procedure p1;
  3  end pkg_tst;
  4  /
Package created.

SQL> select * from user_tab_privs made where table_name = 'PKG_TST';

GRANTEE OWNER   TABLE_NAME GRANTOR PRIVILE GRA HIE
------- ------- ---------- ------- ------- --- ---
B       A       PKG_TST    A       EXECUTE NO  NO

SQL> select status from user_objects where object_name = 'P1';

STATUS
-------
VALID

SQL>

将它与丢弃包并重新创建时发生的情况进行比较。

SQL> drop package pkg_tst;

Package dropped.

SQL> create or replace package pkg_tst as
  2     procedure p1;
  3  end pkg_tst;
  4  /
Package created.

SQL>create or replace package body pkg_tst as
  2    procedure p1 
  3    is
  4    begin
  5      dbms_output.put_line($$plsql_unit||' works!');
  6    end p1;
  7  end;
  8  /
Package body created.

SQL> select * from user_tab_privs made where table_name = 'PKG_TST';

no rows selected

SQL> select status from user_objects where object_name = 'P1';

STATUS
-------
INVALID

SQL> 

因此,使用create or replace package优于drop packagecreate package的好处是显而易见的。它最大限度地减少了将代码更改部署到应用程序的其他部分的影响:

  • 我们不需要在包裹上重新发放补助金
  • 我们不需要重新编译依赖的程序单元

答案 1 :(得分:1)

让我们说: 1)你创建了包; 2)你修改了它。现在,你做什么?包已经创建,所以为了保存您的更改,您必须删除它,然后再次创建。你手动完成这个。但是"创建或替换"你不必这样做。您只需修改并点击编译 - 将始终保存更改。它就像一个具有刷新功能的保存。结论 - oracle节省了您宝贵的时间,您不必再花费额外的时间。

答案 2 :(得分:0)

通过REPLACING而不是DROPPING&创建您依赖于包的其他包/ funcs / procs的问题较少。如果你放弃这些将变得无效。