GBASE南大通用数据库分享:

执行例程的 DBA 权限 

如果 DBA 使用 DBA 关键字创建例程,则数据库服务器自动地仅将 Execute 权限授予有 DBA 权限的其他用户。然而,DBA 可显式地将 DBA 例程上的 Execute 权限授予没有 DBA 权限的用户。 

当用户执行以 DBA 关键字注册了的例程时,该用户假设在例程持续期间持有 DBA 权限。 如果没有 DBA 权限的用户运行 DBA 例程,则数据库服务器隐式地将临时的 DBA 权限 授予调用者。在退出 DBA 例程之前,数据库服务器隐式地撤销该临时的 DBA 权限。

执行 DBA 例程的用户拥有在运行该 DBA 例程期间创建的对象, 除非例程中的语句显式 地命名其他用户作为所有者。 例如,假设 tony 以 DBA 关键字注册 promo() 例程,如下:

GBASE南大通用数据库分享:执行例程的 DBA 权限_数据库

虽然 tony 拥有该例程,但如果 marty 运行它,那么 marty 拥有 catalog 表,但由于用 户 libby 的名称限定 libby.mailers 表名称,使得她成为该表的所有者,因此它拥有该表。

被调用的例程未继承 DBA 权限。如果 DBA 例程执行未以 DBA 关键字创建了的例程, 则 DBA 权限不影响被调用的例程。 

如果未以 DBA 关键字注册的例程调用 DBA 例程,则调用者对于被调用的 DBA 例程必 须有 Execute 权限。该 DBA 例程内的语句执行如同任何 DBA 例程内的语句一样。 

下列示例展示当 DBA 与非 DBA 例程相互作用时发生的情况。假设过 程 dbspc_cleanup() 执行另一过程 clust_catalog()。还假设 clust_catalog()创建索引, 且 clust_catalog() 的 SPL 源代码包括下列语句:

GBASE南大通用数据库分享:执行例程的 DBA 权限_GBASE_02

DBA 过程 dbspc_cleanup() 以下列语句调用其他例程:

GBASE南大通用数据库分享:执行例程的 DBA 权限_数据库_03

假设 tony 注册了 dbspc_cleanup() 作为 DBA 过程,而未以 DBA 关键字注 册 clust_catalog(),如下列语句所示:

GBASE南大通用数据库分享:执行例程的 DBA 权限_GBASE_04

假设用户 marty 运行 dbspc_cleanup()。由于通过非 DBA 例程创建索引 c_clust_ix,因此, 同时拥有两个例程的 tony 也拥有 c_clust_ix。相对地,如果 clust_catalog() 为 DBA 过程, 则 marty 会拥有索引 c_clust_ix,如下列注册和授权语句所示:

GBASE南大通用数据库分享:执行例程的 DBA 权限_数据库_05

GBASE南大通用数据库分享:执行例程的 DBA 权限_数据库服务器_06


#GBASE南大通用分享