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

标签

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值