PostgreSQL SQL filter (SQL 成本|语义过滤器)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介:

标签

PostgreSQL , pg_plan_filter , HOOK , 成本过滤 , 语义过滤 , 防火墙


背景

SQL防火墙,或SQL过滤器,在一些特定的场合可能会比较有用。

例如限制某些用户执行可能会耗费很多资源的SQL,限制用户执行SELECT以外的SQL(尽管SELECT不能保证对数据不产生修改,例如SELECT FUNCTION)。

PostgreSQL 提供了一些HOOK可以用来开发此类功能插件。

planner_hook_type,在pg_plan_filter插件中,通过这个HOOK实现了COST和SELECT的限制。

限制用户只能执行COST低于N的SQL,或者限制用户只能执行SELECT。

static PlannedStmt *  
limit_func(Query *parse, int cursorOptions, ParamListInfo boundParams)  
{  
	PlannedStmt *result;  
  
	/* this way we can daisy chain planner hooks if necessary */  
	if (prev_planner_hook != NULL)  
		result = (*prev_planner_hook) (parse, cursorOptions, boundParams);  
	else  
		result = standard_planner(parse, cursorOptions, boundParams);  
  
    if(filter_select_only && parse->commandType != CMD_SELECT)  
		return result;  
  
	if (statement_cost_limit > 0.0 &&  
		result->planTree->total_cost > statement_cost_limit)  
		ereport(ERROR,  
				(errcode(ERRCODE_STATEMENT_TOO_COMPLEX),  
				 errmsg("plan cost limit exceeded"),  
			  errhint("The plan for your query shows that it would probably "  
					  "have an excessive run time. This may be due to a "  
					  "logic error in the SQL, or it maybe just a very "  
					  "costly query. Rewrite your query or increase the "  
					  "configuration parameter "  
					  "\"plan_filter.statement_cost_limit\".")));  
  
	return result;  
}  

pg_plan_filter用法

1、安装

git clone https://github.com/pgexperts/pg_plan_filter  
  
cd pg_plan_filter/  
  
USE_PGXS=1 make clean  
  
USE_PGXS=1 make   
  
USE_PGXS=1 make  install  

2、配置自动加载插件SO

vi $PGDATA/postgresql.conf  
  
shared_preload_libraries = 'plan_filter'  # 如果已有其他模块,追加即可。 a,b,c,...  

重启PG

pg_ctl restart -m fast  

3、配置用户级参数,设置用户的SQL过滤器

1、限制postgres用户,只能执行COST低于10000的SQL  
  
alter role postgres set plan_filter.statement_cost_limit = 10000;  
  
2、限制TEST用户只能执行SELECT语句。  
  
alter role test set plan_filter.limit_select_only = true;  

当用户重连数据库后,生效。

参考

《PostgreSQL SQL防火墙》

https://github.com/pgexperts/pg_plan_filter

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
存储 SQL 关系型数据库
PolarDB这个sql行存和列存性能差别好大 ,为什么?
PolarDB这个sql行存和列存性能差别好大 ,为什么?
40 0
|
14天前
|
SQL 关系型数据库 数据库
SQL 42501: Postgresql查询中的权限不足错误
SQL 42501: Postgresql查询中的权限不足错误
|
14天前
|
SQL 关系型数据库 MySQL
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
【MySQL】:探秘主流关系型数据库管理系统及SQL语言
26 0
|
2月前
|
SQL 关系型数据库 分布式数据库
在PolarDB中,如果慢SQL导致了CPU升高,进而又产生了更多的慢SQL
【2月更文挑战第22天】在PolarDB中,如果慢SQL导致了CPU升高,进而又产生了更多的慢SQL
16 1
|
3月前
|
SQL 算法 JavaScript
【数据库SQL server】关系型数据库的基本知识
【数据库SQL server】关系型数据库的基本知识
150 0
|
5月前
|
SQL 关系型数据库 C语言
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
PostgreSQL【应用 03】Docker部署的PostgreSQL扩展SQL之C语言函数(编写、编译、载入)计算向量余弦距离实例分享
49 0
|
5月前
|
SQL 关系型数据库 数据库
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
PostgreSQL【应用 02】扩展SQL之C语言函数(编写、编译、载入)实例分享
55 0
|
5月前
|
SQL 关系型数据库 MySQL
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
MySQL【实践 02】MySQL迁移到PostgreSQL数据库的语法调整说明及脚本分享(通过bat命令修改mapper文件内的SQL语法)
130 0
|
5月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
PostgreSQL【SQL 01】根据条件更新字段值或追加信息STRPOS(string, substring)函数使用及LIKE函数对比
65 0
|
5月前
|
SQL 关系型数据库 PostgreSQL
PostgreSQL【部署 01】离线安装PostgreSQL+PostGIS踩坑及问题解决经验分享(含安装文件PostgreSQL+PostGIS及多个依赖+测试SQL)
PostgreSQL【部署 01】离线安装PostgreSQL+PostGIS踩坑及问题解决经验分享(含安装文件PostgreSQL+PostGIS及多个依赖+测试SQL)
149 0

相关产品

  • 云原生数据库 PolarDB