创建和使用 SPL 例程 / 对例程的权限 |
如果 DBA 使用 DBA 关键字创建例程,则数据库服务器自动地仅将 Execute 权限授予有 DBA 权限的其他用户。然而,DBA 可显式地将 DBA 例程上的 Execute 权限授予没有 DBA 权限的用户。
当用户执行以 DBA 关键字注册了的例程时,该用户假设在例程持续期间持有 DBA 权限。如果没有 DBA 权限的用户运行 DBA 例程,则数据库服务器隐式地将临时的 DBA 权限授予调用者。在退出 DBA 例程之前,数据库服务器隐式地撤销该临时的 DBA 权限。
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 例程内的语句一样。
CREATE CLUSTER INDEX c_clust_ix ON catalog (catalog_num);
EXECUTE PROCEDURE clust_catalog(catalog);
CREATE DBA PROCEDURE dbspc_cleanup(loc CHAR) CREATE PROCEDURE clust_catalog(catalog CHAR) GRANT EXECUTE ON dbspc_cleanup(CHAR) to marty;
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 过程。