简化PostgreSQL分区代码的方法

文档序号:8412530阅读:532来源:国知局
简化PostgreSQL分区代码的方法【
技术领域
】[0001]本发明是一种PostgreSQL分区方法,特别是涉及一种简化PostgreSQL分区代码的方法。【
背景技术
】[0002]PostgreSQL数据库的分区数据路由是通过触发器来实现的,例如一个表每个月一个分区表,对应用透明的做法是使用主表和子表,在主表上创建触发器函数,用户访问主表,触发器函数通过用户传递的数据判断数据在哪个子表里面。[0003]现有技术的缺点:通常情况下,每个主表都需要对应至少I个触发器函数,所以主表越多,需要写越多的触发器函数,代码的维护量就越大,出错的概率也越高。通常触发器函数使用静态代码,所以一旦新增子表,就需要修改触发器,例如现在的子表创建到了2014年12月份,当新增子表数量到2015年12月份时,就需要修改触发器代码。如果触发器代码未及时修改的话,到2015年就会出现数据无法插入到正确子表的情况。【
发明内容】[0004]本发明的目的是为解决目前的技术方案存在每个主表都需要对应至少I个触发器函数,所以主表越多,需要写越多的触发器函数,代码的维护量就越大,出错的概率也越高的问题,提供一种简化PostgreSQL分区代码的方法。[0005]本发明解决其技术问题所采用的技术方案是:一种简化PostgreSQL分区代码的方法,包括以下步骤:[0006]步骤一,仓Il建主表,[0007]步骤二,创建子表,[0008]步骤三,创建触发器函数,[0009]步骤四,创建before触发器,传入四个字符串参数,简化PostgreSQL分区代码,[0010]所述触发器函数的实现步骤包括以下子步骤:[0011]子步骤一,触发器函数接收四个字符串参数,[0012]子步骤二,触发器函数打开一个游标,从元表pg_catalog.pg_attribute根据触发器的relid遍历正常的列名,列对应的数据类型,[0013]子步骤三,触发器函数执行封装列名,每个封装列名的格式均为column_name,[0014]子步骤四,触发器函数执行封装值,每个封装值的格式均为NEWIOLD.TABLE_NAME.C0LUMN_NAME::TYPE,[0015]子步骤五,触发器函数判断列名是否等于传入的分区字段名,如果是,则根据传入的分区算法以及该字段的值得到子表名,触发器函数判断列名不等于传入的分区字段名则继续执行子步骤六,[0016]子步骤六,如果游标还有数据,则跳转至子步骤二继续,否则继续执行子步骤七,[0017]子步骤七,将子步骤三和子步骤四和子步骤六得到的值,合并成DMLSQL,子步骤八,调用子步骤七的动态SQL,将在正确的子表执行这个动态SQL,子步骤九,返回空,退出触发器函数。[0018]作为优选,在所述步骤四中,创建before触发器,传入四个字符串参数,所述四个字符串参数分别为:schemaname、tablename、分区列名和分区方法。[0019]作为优选,所述子步骤一中,触发器函数接收schemaname、tabIename、分区列名和分区方法四个字符串参数。[0020]本发明解决了触发器函数代码维护的问题,新增子表不再需要对触发器函数做任何修改,解决了触发器函数不通用的问题,新增分区表不需要再新增触发器函数,一个函数搞定所有的分区算法,解决了不同分区算法需要写多个触发器函数的问题,例如按月分区和按年分区需要写2个触发器函数,使用本发明的方法可以只写一个触发器函数。本发明在触发器函数中利用动态代码替换原有的静态代码,使得新增子表时不需要修改触发器函数,在触发器函数中利用PostgreSQL元表和触发器字符串接口,自动封装父表信息,使得多个主表可以共享一个触发器函数.做到了I个函数,重复利用,本发明通过触发器字符串接口,以及传入分区字段,分区类型,例如createjime字段,按月分区,或按年分区,或按时分区等.根据传入的内容,封装动态SQL,将数据引入指定子表。[0021]本发明的实质性效果是:新增子表时,不需要修改触发器函数。新增主表时,不需要新增触发器函数。使用不同的分区算法时,不需要新增触发器函数。【附图说明】[0022]图1为本发明中的触发器函数逻辑图。【具体实施方式】[0023]下面通过具体实施例,并结合附图,对本发明的技术方案作进一步的具体说明。[0024]实施例:[0025]—种简化PostgreSQL分区代码的方法,包括以下步骤:[0026]步骤一,仓Il建主表,[0027]步骤二,创建子表,[0028]步骤三,创建触发器函数,[0029]步骤四,创建before触发器,传入四个字符串参数,简化PostgreSQL分区代码,[0030]所述触发器函数的实现步骤包括以下子步骤:[0031]子步骤一,触发器函数接收四个字符串参数,[0032]子步骤二,触发器函数打开一个游标,从元表pg_catalog.pg_attribute根据触发器的relid遍历正常的列名,列对应的数据类型,[0033]子步骤三,触发器函数执行封装列名,每个封装列名的格式均为column_name,[0034]子步骤四,触发器函数执行封装值,每个封装值的格式均为NEWIOLD.TABLE_NAME.C0LUMN_NAME::TYPE,[0035]子步骤五,触发器函数判断列名是否等于传入的分区字段名,如果是,则根据传入的分区算法以及该字段的值得到子表名,触发器函数判断列名不等于传入的分区字段名则继续执行子步骤六,[0036]子步骤六,如果游标还有数据,则跳转至子步骤二继续,否则继续执行子步骤七,[0037]子步骤七,将子步骤三和子步骤四和子步骤六得到的值,合并成DMLSQL,子步骤八,调用子步骤七的动态SQL,将在正确的子表执行这个动态SQL,子步骤九,返回空,退出触发器函数。[0038]在所述步骤四中,创建before触发器,传入四个字符串参数,所述四个字符串参数分别为:schemaname、tablename、分区列名和分区方法。[0039]所述子步骤一中,触发器函数接收schemaname、tablename、分区列名和分区方法四个字符串参数。[0040]本发明解决了触发器函数代码维护的问题,新增子表不再需要对触发器函数做任何修改,解决了触发器函数不通用的问题,新增分区表不需要再新增触发器函数,一个函数搞定所有的分区算法,解决了不同分区算法需要写多个触发器函数的问题,例如按月分区和按年分区需要写2个触发器函数,使用本发明的方法可以只写一个触发器函数。本发明在触发器函数中利用动态代码替换原有的静态代码,使得新增子表时不需要修改触发器函数,在触发器函数中利用PostgreSQL元表和触发器字符串接口,自动封装父表信息,使得多个主表可以共享一个触发器函数.做到了I个函数,重复利用,本发明通过触发器字符串接口,以及传入分区字段,分区类型,例如createjime字段,按月分区,或按年分区,或按时分区等.根据传入的内容,封装动态SQL,将数据引入指定子表。[0041]以上所述的实施例只是本发明的一种较佳的方案,并非对本发明作任何形式上的限制,在不超出权利要求所记载的技术方案的前提下还有其它的变体及改型。【主权项】1.一种简化PostgreSQL分区代码的方法,其特征在于:包括以下步骤:步骤一,创建主表,步骤二,创建子表,步骤三,创建触发器函数,步骤四,创建before触发器,传入四个字符串参数,简化PostgreSQL分区代码,所述触发器函数的实现步骤包括以下子步骤:子步骤一,触发器函数接收四个字符串参数,子步骤二,触发器函数打开一个游标,从元表pg_catalog.pg_attribute根据触发器的relid遍历正常的列名,列对应的数据类型,子步骤三,触发器函数执行封装列名,每个封装列名的格式均为column_name,子步骤四,触发器函数执行封装值,每个封装值的格式均为NEW|0LD.TABLE_NAME.COLUMN_NAME::TYPE,子步骤五,触发器函数判断列名是否等于传入的分区字段名,如果是,则根据传入的分区算法以及该字段的值得到子表名,触发器函数判断列名不等于传入的分区字段名则继续执行子步骤六,子步骤六,如果游标还有数据,则跳转至子步骤二继续,否则继续执行子步骤七,子步骤七,将子步骤三和子步骤四和子步骤六得到的值,合并成DMLSQL,子步骤八,调用子步骤七的动态SQL,将在正确的子表执行这个动态SQL,子步骤九,返回空,退出触发器函数。2.根据权利要求1所述的简化PostgreSQL分区代码的方法,其特征在于:在所述步骤四中,创建before触发器,传入四个字符串参数,所述四个字符串参数分别为:schemaname、tabIename、分区列名和分区方法。3.根据权利要求2所述的简化PostgreSQL分区代码的方法,其特征在于:所述子步骤一中,触发器函数接收schemaname、tablename、分区列名和分区方法四个字符串参数。【专利摘要】本发明涉及简化PostgreSQL分区代码的方法。解决了每个主表都需要对应至少1个触发器函数,所以主表越多,需要写越多的触发器函数,代码的维护量就越大,出错的概率也越高的问题,技术方案为:步骤一,创建主表,步骤二,创建子表,步骤三,创建触发器函数,步骤四,创建before触发器,传入四个字符串参数,简化PostgreSQL分区代码,在所述步骤四中,创建before触发器,传入四个字符串参数,所述四个字符串参数分别为:schemaname、tablename、分区列名和分区方法。所述子步骤一中,触发器函数接收schemaname、tablename、分区列名和分区方法四个字符串参数。【IPC分类】G06F17-30【公开号】CN104731863【申请号】CN201510078225【发明人】周正中【申请人】杭州米加科技有限公司【公开日】2015年6月24日【申请日】2015年2月13日
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1