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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介:

标签

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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
10月前
|
SQL 人工智能 关系型数据库
PostgreSQL 常用SQL(持续更新...)
PostgreSQL 常用SQL(持续更新...)
|
12天前
|
SQL 关系型数据库 OLAP
云原生数据仓库AnalyticDB PostgreSQL同一个SQL可以实现向量索引、全文索引GIN、普通索引BTREE混合查询,简化业务实现逻辑、提升查询性能
本文档介绍了如何在AnalyticDB for PostgreSQL中创建表、向量索引及混合检索的实现步骤。主要内容包括:创建`articles`表并设置向量存储格式,创建ANN向量索引,为表增加`username`和`time`列,建立BTREE索引和GIN全文检索索引,并展示了查询结果。参考文档提供了详细的SQL语句和配置说明。
29 1
|
10月前
|
SQL 关系型数据库 数据库
实时计算 Flink版操作报错之使用SQL 将 PostgreSQL 的 date 类型字段转换为 TIMESTAMP 类型时遇到报错,该如何处理
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
6月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
7月前
|
SQL 存储 关系型数据库
PostgreSQL核心之SQL基础学习
PostgreSQL核心之SQL基础学习
94 3
|
7月前
|
SQL 安全 关系型数据库
PostgreSQL SQL注入漏洞(CVE-2018-10915)--处理
【8月更文挑战第8天】漏洞描述:PostgreSQL是一款自由的对象关系型数据库管理系统,支持多种SQL标准及特性。存在SQL注入漏洞,源于应用未有效验证外部输入的SQL语句,允许攻击者执行非法命令。受影响版本包括10.5及更早版本等。解决方法为升级PostgreSQL
418 2
|
7月前
|
SQL 数据管理 关系型数据库
SQL与云计算:利用云数据库服务实现高效数据管理——探索云端SQL应用、性能优化、安全性与成本效益,为企业数字化转型提供全方位支持
【8月更文挑战第31天】在数字化转型中,企业对高效数据管理的需求日益增长。传统本地数据库存在局限,而云数据库服务凭借自动扩展、高可用性和按需付费等优势,成为现代数据管理的新选择。本文探讨如何利用SQL和云数据库服务(如Amazon RDS、Google Cloud SQL和Azure SQL Database)实现高效的数据管理。通过示例和最佳实践,展示SQL在云端的应用、性能优化、安全性及成本效益,助力企业提升竞争力。
115 0
|
7月前
|
SQL 关系型数据库 MySQL
SQL Server、MySQL、PostgreSQL:主流数据库SQL语法异同比较——深入探讨数据类型、分页查询、表创建与数据插入、函数和索引等关键语法差异,为跨数据库开发提供实用指导
【8月更文挑战第31天】SQL Server、MySQL和PostgreSQL是当今最流行的关系型数据库管理系统,均使用SQL作为查询语言,但在语法和功能实现上存在差异。本文将比较它们在数据类型、分页查询、创建和插入数据以及函数和索引等方面的异同,帮助开发者更好地理解和使用这些数据库。尽管它们共用SQL语言,但每个系统都有独特的语法规则,了解这些差异有助于提升开发效率和项目成功率。
769 0
|
9月前
|
SQL 关系型数据库 数据库
nacos 2.2.3版本 查看配置文件的历史版本的接口 是针对MySQL数据库的sql 改成postgresql后 sql语句报错 该怎么解决
在Nacos 2.2.3中切换到PostgreSQL后,执行配置文件历史版本分页查询出错,因`LIMIT 0, 10`语法不被PostgreSQL支持,需改为`LIMIT 10 OFFSET 0`。仅当存在历史版本时报错。解决方案是调整查询SQL以兼容PostgreSQL语法。
|
9月前
|
SQL 关系型数据库 PostgreSQL
【sql】PostgreSQL物化视图表使用案例
【sql】PostgreSQL物化视图表使用案例
89 0

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版