返回首页

gbase数据、南大通用产品文档:GBase8s执行例程的 DBA 权限

更新日期:2024年09月11日

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

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 327 -
当用户执行以 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;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 328 -
请注意,dbspc_cleanup() 无需 DBA 过程来调用 DBA 过程。

参数说明:cm_server 心跳超时时间。
取值范围:整型,2~231 - 1,单位为秒。修改后需要重启cm_agent 才能生效。参数修
改请参考表GUC 参数设置方式进行设置。
默认值:8

创建报表 .........................................
42