更多精彩内容,欢迎观看:《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(上)——三、产品相关概念(上):
https://developer.aliyun.com/article/1222912?groupCode=certification
1. 权限管理
权限管理支持从实例、数据库、schema到object权限的控制。
1) 逻辑结构及其权限关系
• 实例权限:实例连接鉴权。
• 数据库权限:grant赋予是否允许连接或创造schema的权限和Revoke回收。
数据库级别权限包括:
√ 是否允许连接数据库。
√ 是否允许在数据库中创建schema。
√ 默认允许public角色连接,即允许任何人连接。
√ 默认不允许除了超级用户和owner之外的任何人在数据库中创建schema。
√ 默认会自动创建名为public的schema,且允许任何人在里面创建对象。
• schema权限:grant赋予允许查询schema中的对象和revoke回收。
schema级别权限包括:
√ 是否允许查看schema中的对象;
√ 是否允许在schema中创建对象;
√ 默认情况下新建的schema的权限不会赋予给public角色,因此除了超级用户和owner,任何人都没有权限查看schema中的对象或者在schema中新建对象。
• object权限:grant赋予和revoke回收。
2) 权限管理:授予和撤销权限
• 授予权限的关键字:GRANT
GRANT权限ON对象类型对象名TO用户名,如:
√ GRANT SELECT ON TABLE table TO user1; --允许 user1 select table
√ GRANT SELECT ON TABLE table TO public; --允许所有人 select table
• 撤销权限的关键字:REVOKE
REVOKE权限ON对象类型对象名FROM用户名,如:
√ REVOKE SELECT ON TABLE table FROM user1; --不再允许 user1 select table
2. UDF与存储过程
1) UDF与存储过程概述
• 在AnalyticDB PostgreSQL中,创建UDF和存储过程都是采用CREATE FUNCTION语法。
• 不同于ORACLE、MYSQL等数据库,PostgreSQL中并没有专门用于创建存储过程的CREATE PROCEDURE语法。
• 以SQL过程语言PL/pgSQL用法最为广泛,最为贴近内核。
PL/pgSQL的功能特点
• 用于创建函数和触发器过程
• 为SQL语言增加控制结构
• 执行复杂的计算
• 继承所有用户定义类型、函数、操作符
• 定义为被服务器信任的语言
• 容易使用
2) PL/pgSQL基本结构介绍
AnalyticDB PostgreSQL函数通常结构如下:
• CREATEFUNCTION --函数名
• CREATE FUNCTION somefunc(integer, text) RETURNS integer --返回类型
• AS
• functionfunction --参数
• function body text --函数体
• functionfunction
• LANGUAGE plpgsql; --解释语言
3) 块结构介绍
PL/pgSQL是一个块结构语言,函数体由块结构组成,定义如下:
BLOCK[<<label>>][DECLARE declarations]BEGIN statementsEND [label];
注意
• 块中的每个声明和每条语句都是用一个分号终止。
• 块结构支持嵌套使用。子块用于逻辑分组,在子块中声明的变量在其范围之内,将屏蔽跟这个子块外部有着同样的名字的变量。
• BEGIN之后不要分号。
• END之后要分号。最外层的可缺省。
• END后的标签要和块开始的标签保持一致。
• 所有关键字不区分大小写,默认转换成小写,除非被双引号引用。
• 注释的方法和普通SQL一样。
• PL/pgSQL里用于语句块分组的 BEGIN/END 不是开始或者结束事务。
块结构示例
CREATE OR REPLACE FUNCTION somefunc()RETURNS integer AS $$ <<outerblack>> DECLARE quantity integer:=30; BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 30 Quantity:= 50; -- --Create a subblock -- DECLARE quantity integer:80 BEGIN RAISE NOTICE 'Quantity here is %', quantity; -- Prints 80 RAISE NOTICE 'Outer quantity here is %', outerblock.quantity; --Prints 50 END; RAISE NOTICE 'Quantity here is %, quantity; --Prints 50 RETURN quantity; END; $$LANGUAGE plpgsal;
4) 捕获异常
PL/pgSQL通过EXCEPTION从句捕获异常。
[<<label>>] [DECLARE declarations] BEGIN statements EXCEPTION WHEN condition [OR condition ...] THEN handler_statements [WHEN condition[OR condition ...] THEN handler statements ...] END;
注意
• condition表示异常类别,参考errcodes:
https://help.aliyun.com/document_detail/205012.html
• 特殊的异常类别OTHERS,可以匹配所有类别的异常。
• 块中包含EXCEPTION从句,则能够形成一个子事务,并且能够在不影响外部事务的前提下回滚。
示例
CREATE OR REPLACE FUNCTION f_block_exception() RETURNS integer LANGUAGEplpgsql AS Sfunction$ DECLARE x integer:= 0; y integer:= 0; BEGIN SELECT COUNT(*) INTO x FROM mytab WHERE lastname='zhang'; INSERT INTO mytab(firstname, lastname) VALUES('san','zhang); DECLARE msg text; BEGIN UPDATEmytab sET firstname: three'WHERElastnamzhang; x:=x+1; y:=x/0; --Exception occurs EXCEPTION WHEN OTHERS THEN GET STACKED DIAGNOSTICS msg := MESSAGE_TEXT; RAISE NOTICE 'Caught exception:%',msg; RETURN x; END; END; $function$;
5) UDF示例
• 创建表student,插入3条记录
create table student(name varchar(30), score float4); insert into student values('张三',88),('李四,99),('王五,92);
• 创建函数将student记录转换成json格式
create or replace function f_student_to json(student) returns json language plpgsql strict as function$ declare stu alias for $1; begin return row_to_json(stu); end; $function$;
• 创建操作符>!<使用f_student_to_json函数
create operator>!<(procedure=f_student_to_json, leftarg=student);
• 使用操作符>!<遍历student表
selects>!<from students;
更多精彩内容,欢迎观看:《阿里云认证的解析与实战-数据仓库ACP认证》——云原生数据仓库AnalyticDB PostgreSQL版解析与实践(上)——三、产品相关概念(下):
https://developer.aliyun.com/article/1222910?groupCode=certification