更新时间:2024-11-12 GMT+08:00
分享

ALTER PACKAGE

功能描述

修改PACKAGE的属性或重编译包。

注意事项

  • 目前仅支持ALTER PACKAGE OWNER功能,系统管理员默认拥有该权限,有以下权限约束:
    • 当前用户必须是该package的所有者或者系统管理员,且该用户是新所有者角色的成员。
  • 当打开三权分立时,即使是系统管理员,也必须拥有用户组权限才能修改package的owner,DEFINER类型package不允许修改所有者。
  • 只有初始化用户才能修改package的owner为初始化用户。
  • 当关闭三权分立时,仅系统管理员以上权限可以修改package所有者,但不允许修改所有者为运维管理员。
  • 不允许系统管理员将DEFINER类型的package的所有者改为初始用户或运维管理员。

语法格式

  • 修改package的所有者。
    ALTER PACKAGE package_name OWNER TO new_owner;

  • 重编译包。
    ALTER PACKAGE package_name COMPILE [PACKAGE | BODY | SPECIFICATION];

参数说明

  • package_name

    要修改的package名称。

    取值范围:已存在的package名,仅支持修改单个package。

  • new_owner

    package的新所有者。要修改函数的所有者,新所有者必须拥有该package所属模式的CREATE权限。

    取值范围:已存在的用户角色。

示例

  • 修改PACKAGE的所有者。
    --创建数据库。
    gaussdb=# CREATE DATABASE test DBCOMPATIBILITY 'ORA';
    gaussdb=# \c test
    
    --创建PACKAGE。
    test=# CREATE OR REPLACE PACKAGE test_pkg AS
        pkg_var int := 1;
        PROCEDURE test_pkg_proc(var int);
    END test_pkg;
    /
    
    test=# CREATE OR REPLACE PACKAGE BODY test_pkg AS
        PROCEDURE test_pkg_proc(var int) AS
        BEGIN
            pkg_var := 1;
        END;
    END test_pkg;
    /
    
    --创建用户。
    test=# CREATE ROLE test PASSWORD '********';
    
    --修改包的所有者。
    test=# ALTER PACKAGE test_pkg OWNER TO test;
    
    --查询test_pkg的所有者。
    test=# SELECT t1.pkgname,t2.rolname FROM gs_package t1, gs_roles t2 WHERE t1.pkgname = 'test_pkg' AND t1.pkgowner = t2.oid;
     pkgname  | rolname 
    ----------+---------
     test_pkg | test
    (1 row)
    
    --删除。
    test=# DROP PACKAGE test_pkg;
    test=# DROP ROLE test;
    --切换至默认数据库(根据实际情况修改数据库名)。
    test=# \c postgres
    gaussdb=# DROP DATABASE test;

相关链接

CREATE PACKAGEDROP PACKAGE

相关文档