PostgreSQL在创建存储过程/函数时没有执行语义分析/校验,可以用plpgsql_check这个插件进行检查,除此之外,该插件还能发现函数依赖和进行函数性能分析。
本节简单介绍该扩展的安装和使用。
pplpgsql_check可完成下面3个工作:
1.检查在一个函数代码编译错误
2.发现在函数依赖关系
3.分析函数 引用>特性包括:
1.检查数据库对象和引用类型的字段,在嵌入式SQL
2.使用正确类型的函数参数
3.argumens argumens未使用的变量和函数,修改的
4.部分检测死代码(由于返回命令)
5.检测失踪返回命令的功能
6.试图识别出不必要的隐藏的投射,可以像未使用索引性能问题
7.可能收集关系和函数所使用的函数
8.检查执行支撑可能性转为SQL注入漏洞 引用><强> 安装 强>
从github上下载源码,使/make install <>之前 <代码> [pg12@localhost plpgsql_check] $ pwd/数据//postgresql-12beta1 contrib/plpgsql_check来源 [pg12@localhost plpgsql_check] $ ls _config。yml plpgsql_check。控制postgresql95-plpgsql_check.spec 预计plpgsql_check。所以postgresql96-plpgsql_check.spec 许可postgresql10-plpgsql_check。规范README.md Makefile postgresql11-plpgsql_check。规范的sql 元。json postgresql12-plpgsql_check。规范src msvc postgresql13-plpgsql_check。规范TODO.md plpgsql_check——1.7。sql postgresql94-plpgsql_check.spec [pg12@localhost plpgsql_check]美元 … [pg12@localhost plpgsql_check] $ sudo make install 让- c . ./. .后端generated-headers/src/[1]:进入目录“/数据/源/postgresql-12beta1/src/后端” 让- c目录distprep generated-header-symlinks [2]:进入目录“/数据/源/postgresql-12beta1/src/后端/目录” [2]:什么也不需要做“distprep”。 [2]:什么也不需要做“generated-header-symlinks”。 [2]:离开目录“/数据/源/postgresql-12beta1/src/后端/目录” 让- c跑龙套distprep generated-header-symlinks [2]:进入目录“/数据/源/postgresql-12beta1/src/后端/跑龙套的 [2]:什么也不需要做“distprep”。 [2]:什么也不需要做“generated-header-symlinks”。 [2]:离开目录“/数据/源/postgresql-12beta1/src/后端/跑龙套的 [1]:离开目录“/数据/源/postgresql-12beta1/src/后端”/usr/bin/mkdir - p '/appdb/xdb/pg12beta1/lib/postgresql的/usr/bin/mkdir - p '/appdb/xdb pg12beta1/分享/postgresql/扩展的/usr/bin/mkdir - p '/appdb/xdb pg12beta1/分享/postgresql/扩展的 755 plpgsql_check/usr/bin/install - c - m。所以'/appdb/xdb/pg12beta1/lib/postgresql/plpgsql_check.so '/usr/bin/install - c - m 644。/plpgsql_check。控制”/appdb/xdb/pg12beta1/分享/postgresql/扩展/'/usr/bin/install - c - m 644。/plpgsql_check——1.7。sql '/appdb/xdb pg12beta1/分享/postgresql/扩展/' 代码> >之前plpgsql_check插件需要预加载动态链接库,需修改postgresql.conf文件
<>之前 <代码> [pg12@localhost pg12db1] $ grep shared_preload postgresql.conf shared_preload_libraries=' pg_stat_statements、pg_qualstats plpgsql, plpgsql_check’#(改变需要重新启动) [pg12@localhost pg12db1]美元pg_ctl重启 等待服务器关闭....完成 服务器停止 等待服务器启动....2019-08-09 12:07:00.242中科[2086]日志:PostgreSQL 12 beta1 x86_64-pc-linux-gnu开始,由海湾合作委员会(gcc)编制4.8.5 20150623 (Red Hat 4.8.5-16), 64位 2019-08-09 12:07:00.243中科[2086]日志:监听IPv4地址0.0.0.0,端口5432 2019-08-09 12:07:00.243中科[2086]日志:监听IPv6地址“::”,端口5432 2019-08-09 12:07:00.256中科[2086]日志:Unix监听套接字“/tmp/.s.PGSQL.5432” 2019-08-09 12:07:00.407中科[2086]日志:将日志输出日志收集过程 2019-08-09 12:07:00.407中科[2086]提示:未来日志输出“pg_log”将出现在目录中。 完成 服务器开始 代码> >之前创建扩展
<>之前 <代码> (本地):5432 pg12@testdb=#创建扩展plpgsql_check; 创建扩展 时间:235.761毫秒 代码> >之前<强> 语义检查 强>
数据表t_noexists不存在,但PG并没有执行语义检查 <>之前 <代码> (本地):5432 pg12@testdb=#创建或替换过程sp_error (int) pg12@testdb——# pg12@testdb - # $ $ pg12@testdb $ #声明 pg12@testdb $ # v_id整数:=0; pg12@testdb $ #开始 pg12@testdb #从t_notexists选择1美元; pg12@testdb $ #结束; 语言plpgsql pg12@testdb $ # $ $; 创建过程 时间:2.265毫秒 (本地):5432 pg12@testdb=#叫sp_error (1); 错误:“t_notexists”的关系并不存在 1号线:从t_notexists选择1 ^ 查询:从t_notexists选择1 背景:PL/pgSQL函数sp_error(整数)第5行SQL语句 时间:2.743毫秒 (本地):5432 pg12@testdb=#PostgreSQL DBA(72)——扩展(pgplsql_check)