执行例程的 DBA 权限

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

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

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

虽然 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 源代码包括下列语句:
CREATE CLUSTER INDEX c_clust_ix ON catalog (catalog_num);
DBA 过程 dbspc_cleanup() 以下列语句调用其他例程:
EXECUTE PROCEDURE clust_catalog(catalog);
假设 tony 注册了 dbspc_cleanup() 作为 DBA 过程,而未以 DBA 关键字注册 clust_catalog(),如下列语句所示:
CREATE DBA PROCEDURE dbspc_cleanup(loc CHAR)
                CREATE PROCEDURE clust_catalog(catalog CHAR)
                GRANT EXECUTE ON dbspc_cleanup(CHAR) to marty;
假设用户 marty 运行 dbspc_cleanup()。由于通过非 DBA 例程创建索引 c_clust_ix,因此,同时拥有两个例程的 tony 也拥有 c_clust_ix。相对地,如果 clust_catalog() 为 DBA 过程,则 marty 会拥有索引 c_clust_ix,如下列注册和授权语句所示:
CREATE PROCEDURE dbspc_cleanup(loc CHAR);
                CREATE DBA PROCEDURE clust_catalog(catalog CHAR);
                GRANT EXECUTE ON clust_catalog(CHAR) to marty;

请注意,dbspc_cleanup() 无需 DBA 过程来调用 DBA 过程。