基本概念

这里是融合版的一个需求,属于兼容性需求类别,主要实现的是一个黑名单,是要把一个列表中的多个插件不允许在MSSQL兼容安装包中出现,或只能在5432端口(PG模式)中使用,不能在1433端口(MSSQL模式)中使用。

初步分析

根据需求列表,可以基本将需要修改的插件分为三类:

  • 禁止在双端口安装使用;
  • 在5432端口允许使用,1433端口禁止安装使用;
  • 双端口都允许使用;

其中,需求描述特别提到,允许在编译阶段进行修改,由此可以对应的提出三类插件的修改方案:

  • 在编译阶段不安装,也就是在contrib/Makefile中的SUBDIR安装插件,删除这些不允许在双端口安装的插件;
  • 在hooks.c中增加一个名单,名单中包含这些允许在5432不允许在1433安装的插件,首先检测当前dialect是否为tsql,如果为tsql,检查是否是T_CreExtensionStmt,如果是则检查插件名单是否在这个名单之内,如果没有则放行,有则报错;
  • 不做任何处理;

理论上,以上方案实施后,能够达到双端口不可用则直接无法找到插件,用户自行安装则不保证可能出现的任何问题;对于5432可用1433不可用,会进行报错;其他类型不做处理;应该可以达到需求描述的目的实现;

边界考虑

  • 由于删除了某些插件编译且对某些插件在一定场景进行了屏蔽,考虑数据库升级场景,如果以前使用过此插件,现在进行了屏蔽,可能导致升级失败;

灵活性

  • 现在的屏蔽方式是使用直接修改编译文件与硬编码名单的方式实现,如果在一个版本内,由于某些特殊原因想启用已屏蔽的插件,则在当前版本是无法实现的。如果将名单作成guc参数,则可以提供灵活性,但是一旦被手动篡改,则无法预料可能产生的问题;