{"id":377673,"date":"2024-06-01T03:00:04","date_gmt":"2024-06-01T03:00:04","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=377673"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2024-06-01T03:00:04","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=377673","title":{"rendered":"<span>\u041c\u0430\u043a\u0440\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f PostgreSQL<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 SQL \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0411\u0414 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043f\u043e\u0440\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u044f\u0437\u044b\u043a\u0430. \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 SQL \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0411\u0414.<\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c \u043c\u0430\u043a\u0440\u043e\u044f\u0437\u044b\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/M4_(%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80)\" rel=\"noopener noreferrer nofollow\">m4<\/a>, \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0438 \u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 C &#8212; cpp \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 GCC.<\/p>\n<p>\u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0435\u0440\u043d\u044b \u0434\u043b\u044f Linux \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 GCC \u0438 Perl. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, Windows \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0442\u0430\u043c GCC \u0438 Perl \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<h2>\u041e\u0431\u0445\u043e\u0434\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f C \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/h2>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435, \u043d\u043e \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 C \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438. \u0422\u0430\u043a \u0436\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435\u043d\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Perl<\/p>\n<pre><code class=\"perl\">#!bin\\perl open INFILE, $ARGV[0]; if ( $#ARGV>0  ) {   open OUTFILE, '>', $ARGV[1]; } LINE:     while (&lt;INFILE>) {       s\/(`\\|)|(`\\[)|(`\\])|(`\\{)|(`\\})\/         if (length($2)>0 | length($3)>0) {chr(0x22)}          elsif (length($4)>0 | length($5)>0) {chr(0x27)}         else {''}\/eg;     } continue {       if ( $#ARGV>0  ) {         print OUTFILE;       } else {         print;       }     } <\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0437\u043d\u0430\u0442\u043e\u043a Perl, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0439\u0434\u0443\u0442 \u0432 \u043d\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0435\u0445\u043e\u0432. \u041d\u043e \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\">\u0418\u0441\u043a\u043e\u043c\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0417\u0430\u043c\u0435\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`|<\/p>\n<\/td>\n<td>\n<p align=\"center\">(\u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 &#8212; \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`[ \u0438\u043b\u0438 `]<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#187; (\u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`[ \u0438\u043b\u0438 `]<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8216; (\u043e\u0434\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043a\u0430\u0432\u044b\u0447\u043a\u0430)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u0434 \u043b\u044e\u0431\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0430 \u0432 \u043d\u0435\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CRE<\/p>\n<\/td>\n<td>\n<p align=\"left\">DDL \u0444\u0430\u0439\u043b\u044b \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">INC<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PROC<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SYS<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">TYPE<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">VIEW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0410 \u0432 \u0441\u0430\u043c\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"cpp\">#include \"INC\/_macros_list.sql\"      \/\/ \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f #include \"SYS\/_before_list.sql\"      \/\/ \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 #include \"TYPE\/_types_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 #include \"CRE\/_tables_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446 #include \"VIEW\/_views_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 #include \"PROC\/_procedures_list.sql\" \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 #include \"SYS\/_after_list.sql\"       \/\/ \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0443\u0441\u0442\u044b\u043c, \u043b\u0438\u0431\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 #include, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 SQL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 CRE \u0444\u0430\u0439\u043b SVC_ExecutionLog.sql<\/p>\n<pre><code class=\"pgsql\">#define OBJECT_NAME SVC_ExecutionLog CREATE TABLE IF NOT EXISTS SQL_DB_INSTANCE.OBJECT_NAME (   Id              serial    PRIMARY KEY,   LogTime         timestamp DEFAULT clock_timestamp(),   PID             integer   DEFAULT pg_backend_pid(),   Schema          text      DEFAULT current_schema,   SourceName      text      DEFAULT current_query(),   LogLevel        smallint  DEFAULT 0,  \/\/ 0 - Notice, 4 - Info, 8 - Warning, 12 - user error, 16 - user severe error, 32 - SQL error   SessionId       integer   NOT NULL,   IsStart         boolean   NULL,   IsFinish        boolean   NULL,   ParameterId     smallint  NULL,   SQLState        text      NULL,   SQLColumn       text      NULL,   SQLConstraint   text      NULL,   SQLDataType     text      NULL,   SQLTable        text      NULL,   SQLSchema       text      NULL,   SQLMessage      text      NULL,   SQLDetail       text      NULL,   SQLHint         text      NULL,   SQLContext      text      NULL,   LogMessageId    integer   NULL,   LogMessage      text      NULL,   LogIntData      bigint    NULL,   LogDateData     timestamp NULL,   LogIntervalData interval  NULL,   LogTextData     varchar   NULL,   LogNumData      float8    NULL,   LogBooleanData  boolean   NULL,   LogTableContent text      NULL,   LogIntervalms   integer   NULL );  CREATE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId, LogTime); CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Parmeters_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId, ParameterId)   WHERE ParameterId IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_SessionParmeters_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (ParameterId, SessionId)   WHERE ParameterId IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Initialized_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId) WHERE IsStart; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Finished_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId) WHERE IsFinish;  ALTER TABLE SQL_DB_INSTANCE.OBJECT_NAME OWNER TO postgres; GRANT SELECT, INSERT ON SQL_DB_INSTANCE.OBJECT_NAME TO some_user; #undef OBJECT_NAME <\/code><\/pre>\n<p>\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b CRE\/_tables_list.sql \u0441\u0442\u0440\u043e\u043a\u0443<\/p>\n<pre><code class=\"cpp\">#include \"SVC_ExecutionLog.sql\"<\/code><\/pre>\n<p>\u0410 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 INC \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b LogSQLException.inc <\/p>\n<pre><code class=\"pgsql\">#define SVC_LOG_SQL_EXCEPTION_AND_RETURN \\   EXCEPTION WHEN OTHERS THEN \\     GET STACKED DIAGNOSTICS proc.sql_state=RETURNED_SQLSTATE, proc.sql_column=COLUMN_NAME, proc.sql_constraint=CONSTRAINT_NAME, \\       proc.sql_datatype=PG_DATATYPE_NAME, proc.sql_table=TABLE_NAME, proc.sql_schema=SCHEMA_NAME, proc.sql_message=MESSAGE_TEXT, \\       proc.sql_detail=PG_EXCEPTION_DETAIL, proc.sql_hint=PG_EXCEPTION_HINT, proc.sql_context=PG_EXCEPTION_CONTEXT; \\     INSERT INTO SQL_DB_INSTANCE.SVC_ExecutionLog (LogLevel, SessionId, LogMessage, \\       SQLState, SQLColumn, SQLConstraint, SQLDataType, SQLTable, SQLSchema, SQLMessage, SQLDetail, SQLHint, SQLContext) \\     VALUES (32, session_id, 'SQL error '||proc.sql_message, \\       proc.sql_state, proc.sql_column, proc.sql_constraint, proc.sql_datatype, proc.sql_table, proc.sql_schema, \\       proc.sql_message, proc.sql_detail, proc.sql_hint, proc.sql_context); \\     COMMIT; \\     RAISE WARNING 'SQL error %', sql_message; \\     RETURN 32; \\   END; <\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b INC\/_macros_list.sql \u0441\u0442\u0440\u043e\u043a\u043e\u0439 #include, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"pgsql\">BEGIN   &lt;\u043a\u0430\u043a\u0438\u0435-\u0442\u043e DDL \u0438\u043b\u0438 DML \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f> SVC_LOG_SQL_EXCEPTION_AND_RETURN<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 cpp \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 -D SQL_DB_INSTANCE=schema_name, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b cpp \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 Perl \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u044f\u0434 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/818775\/\"> https:\/\/habr.com\/ru\/articles\/818775\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 SQL \u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0411\u0414 \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u043f\u043e\u0440\u043e\u0439 \u043e\u0447\u0435\u043d\u044c \u043d\u0435\u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0435\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u044f\u0437\u044b\u043a\u0430. \u041f\u0440\u043e\u0441\u0442\u044b\u043c\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c\u0438 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u043e\u0445\u043e\u0436\u0438\u0435 \u0432\u044b\u0440\u0430\u0436\u0435\u043d\u0438\u044f, \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u043e\u043f\u0435\u0440\u0430\u0442\u043e\u0440\u043e\u0432 SQL \u0438\u043b\u0438 \u0434\u0430\u0436\u0435 \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0441\u043a\u0440\u0438\u043f\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0411\u0414.<\/p>\n<p>\u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0440\u0430\u0437\u0432\u0438\u0442\u044b\u043c \u043c\u0430\u043a\u0440\u043e\u044f\u0437\u044b\u043a\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/M4_(%D0%BC%D0%B0%D0%BA%D1%80%D0%BE%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80)\" rel=\"noopener noreferrer nofollow\">m4<\/a>, \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0447\u0438\u043a\u0438 \u0435\u0433\u043e \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0431\u044b\u043b \u0432\u044b\u0431\u0440\u0430\u043d \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0439, \u043d\u043e \u043c\u043d\u043e\u0433\u0438\u043c \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 C &#8212; cpp \u0438\u0437 \u0441\u043e\u0441\u0442\u0430\u0432\u0430 GCC.<\/p>\n<p>\u0412\u0441\u0435 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0432\u0435\u0440\u043d\u044b \u0434\u043b\u044f Linux \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u043c\u0438 GCC \u0438 Perl. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, Windows \u043f\u043e\u0434 \u0440\u0443\u043a\u043e\u0439 \u0443 \u043c\u0435\u043d\u044f \u043d\u0435\u0442, \u043d\u043e \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0442\u0430\u043c GCC \u0438 Perl \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u043e.<\/p>\n<h2>\u041e\u0431\u0445\u043e\u0434\u0438\u043c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f C \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/h2>\n<p>\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0432\u0435\u0437\u0434\u0435, \u043d\u043e \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 C \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0442\u043e, \u0447\u0442\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043e\u0434\u0438\u043d\u0430\u0440\u043d\u044b\u043c\u0438 \u0438 \u0434\u0432\u043e\u0439\u043d\u044b\u043c\u0438 \u0441\u043a\u043e\u0431\u043a\u0430\u043c\u0438. \u0422\u0430\u043a \u0436\u0435 \u0432 \u043d\u0435\u043c \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435\u043d\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043e\u0431\u043e\u0439\u0442\u0438 \u044d\u0442\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0431\u044b\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Perl<\/p>\n<pre><code class=\"perl\">#!bin\\perl open INFILE, $ARGV[0]; if ( $#ARGV>0  ) {   open OUTFILE, '>', $ARGV[1]; } LINE:     while (&lt;INFILE>) {       s\/(`\\|)|(`\\[)|(`\\])|(`\\{)|(`\\})\/         if (length($2)>0 | length($3)>0) {chr(0x22)}          elsif (length($4)>0 | length($5)>0) {chr(0x27)}         else {''}\/eg;     } continue {       if ( $#ARGV>0  ) {         print OUTFILE;       } else {         print;       }     } <\/code><\/pre>\n<p>\u042f \u043d\u0435 \u0437\u043d\u0430\u0442\u043e\u043a Perl, \u0442\u0430\u043a \u0447\u0442\u043e \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u0438\u0441\u0442\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u043d\u0430\u0439\u0434\u0443\u0442 \u0432 \u043d\u0435\u043c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0433\u0440\u0435\u0445\u043e\u0432. \u041d\u043e \u0441\u0432\u043e\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043e\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442, \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f \u0432 \u0442\u0435\u043a\u0441\u0442\u0435 \u0437\u0430\u043c\u0435\u043d\u044b \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0442\u0430\u0431\u043b\u0438\u0446\u0435\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\">\u0418\u0441\u043a\u043e\u043c\u0430\u044f \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u044f \u0441\u0438\u043c\u0432\u043e\u043b\u043e\u0432<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u0417\u0430\u043c\u0435\u043d\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`|<\/p>\n<\/td>\n<td>\n<p align=\"center\">(\u043f\u0443\u0441\u0442\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 &#8212; \u043a\u043e\u043d\u043a\u0430\u0442\u0435\u043d\u0430\u0446\u0438\u044f)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`[ \u0438\u043b\u0438 `]<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#187; (\u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"center\">`[ \u0438\u043b\u0438 `]<\/p>\n<\/td>\n<td>\n<p align=\"center\">&#8216; (\u043e\u0434\u0438\u043d\u0430\u0440\u043d\u0430\u044f \u043a\u0430\u0432\u044b\u0447\u043a\u0430)<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<h2>\u041f\u0440\u0438\u043c\u0435\u0440 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f<\/h2>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u0434 \u043b\u044e\u0431\u044b\u043c \u0438\u043c\u0435\u043d\u0435\u043c, \u0430 \u0432 \u043d\u0435\u0439 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439:<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<td>\n<p align=\"center\">\u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f<\/p>\n<\/td>\n<td>\n<p align=\"center\">\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">CRE<\/p>\n<\/td>\n<td>\n<p align=\"left\">DDL \u0444\u0430\u0439\u043b\u044b \u0442\u0430\u0431\u043b\u0438\u0446<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">INC<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">PROC<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0445\u0440\u0430\u043d\u0438\u043c\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">SYS<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">TYPE<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">VIEW<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0410 \u0432 \u0441\u0430\u043c\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b:<\/p>\n<pre><code class=\"cpp\">#include \"INC\/_macros_list.sql\"      \/\/ \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f #include \"SYS\/_before_list.sql\"      \/\/ \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 #include \"TYPE\/_types_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u0438\u043f\u043e\u0432 \u0434\u0430\u043d\u043d\u044b\u0445 #include \"CRE\/_tables_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0442\u0430\u0431\u043b\u0438\u0446 #include \"VIEW\/_views_list.sql\"      \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0439 #include \"PROC\/_procedures_list.sql\" \/\/ \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 #include \"SYS\/_after_list.sql\"       \/\/ \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0435 \u0432 \u043a\u043e\u043d\u0446\u0435<\/code><\/pre>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b\u043e\u0432 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043b\u0438\u0431\u043e \u043f\u0443\u0441\u0442\u044b\u043c, \u043b\u0438\u0431\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0438 #include, \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0449\u0438\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u0443\u0436\u0435 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0438\u043b\u0438 SQL \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0443\u0440\u043d\u0430\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 CRE \u0444\u0430\u0439\u043b SVC_ExecutionLog.sql<\/p>\n<pre><code class=\"pgsql\">#define OBJECT_NAME SVC_ExecutionLog CREATE TABLE IF NOT EXISTS SQL_DB_INSTANCE.OBJECT_NAME (   Id              serial    PRIMARY KEY,   LogTime         timestamp DEFAULT clock_timestamp(),   PID             integer   DEFAULT pg_backend_pid(),   Schema          text      DEFAULT current_schema,   SourceName      text      DEFAULT current_query(),   LogLevel        smallint  DEFAULT 0,  \/\/ 0 - Notice, 4 - Info, 8 - Warning, 12 - user error, 16 - user severe error, 32 - SQL error   SessionId       integer   NOT NULL,   IsStart         boolean   NULL,   IsFinish        boolean   NULL,   ParameterId     smallint  NULL,   SQLState        text      NULL,   SQLColumn       text      NULL,   SQLConstraint   text      NULL,   SQLDataType     text      NULL,   SQLTable        text      NULL,   SQLSchema       text      NULL,   SQLMessage      text      NULL,   SQLDetail       text      NULL,   SQLHint         text      NULL,   SQLContext      text      NULL,   LogMessageId    integer   NULL,   LogMessage      text      NULL,   LogIntData      bigint    NULL,   LogDateData     timestamp NULL,   LogIntervalData interval  NULL,   LogTextData     varchar   NULL,   LogNumData      float8    NULL,   LogBooleanData  boolean   NULL,   LogTableContent text      NULL,   LogIntervalms   integer   NULL );  CREATE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId, LogTime); CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Parmeters_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId, ParameterId)   WHERE ParameterId IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_SessionParmeters_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (ParameterId, SessionId)   WHERE ParameterId IS NOT NULL; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Initialized_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId) WHERE IsStart; CREATE UNIQUE INDEX IF NOT EXISTS OBJECT_NAME`|_Session_Finished_Idx ON SQL_DB_INSTANCE.OBJECT_NAME (SessionId) WHERE IsFinish;  ALTER TABLE SQL_DB_INSTANCE.OBJECT_NAME OWNER TO postgres; GRANT SELECT, INSERT ON SQL_DB_INSTANCE.OBJECT_NAME TO some_user; #undef OBJECT_NAME <\/code><\/pre>\n<p>\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u0444\u0430\u0439\u043b CRE\/_tables_list.sql \u0441\u0442\u0440\u043e\u043a\u0443<\/p>\n<pre><code class=\"cpp\">#include \"SVC_ExecutionLog.sql\"<\/code><\/pre>\n<p>\u0410 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 INC \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b LogSQLException.inc <\/p>\n<pre><code class=\"pgsql\">#define SVC_LOG_SQL_EXCEPTION_AND_RETURN \\   EXCEPTION WHEN OTHERS THEN \\     GET STACKED DIAGNOSTICS proc.sql_state=RETURNED_SQLSTATE, proc.sql_column=COLUMN_NAME, proc.sql_constraint=CONSTRAINT_NAME, \\       proc.sql_datatype=PG_DATATYPE_NAME, proc.sql_table=TABLE_NAME, proc.sql_schema=SCHEMA_NAME, proc.sql_message=MESSAGE_TEXT, \\       proc.sql_detail=PG_EXCEPTION_DETAIL, proc.sql_hint=PG_EXCEPTION_HINT, proc.sql_context=PG_EXCEPTION_CONTEXT; \\     INSERT INTO SQL_DB_INSTANCE.SVC_ExecutionLog (LogLevel, SessionId, LogMessage, \\       SQLState, SQLColumn, SQLConstraint, SQLDataType, SQLTable, SQLSchema, SQLMessage, SQLDetail, SQLHint, SQLContext) \\     VALUES (32, session_id, 'SQL error '||proc.sql_message, \\       proc.sql_state, proc.sql_column, proc.sql_constraint, proc.sql_datatype, proc.sql_table, proc.sql_schema, \\       proc.sql_message, proc.sql_detail, proc.sql_hint, proc.sql_context); \\     COMMIT; \\     RAISE WARNING 'SQL error %', sql_message; \\     RETURN 32; \\   END; <\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u0432 \u0444\u0430\u0439\u043b INC\/_macros_list.sql \u0441\u0442\u0440\u043e\u043a\u043e\u0439 #include, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0432\u044b\u0448\u0435.<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0433\u0434\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0432 \u0445\u0440\u0430\u043d\u0438\u043c\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435, \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e:<\/p>\n<pre><code class=\"pgsql\">BEGIN   &lt;\u043a\u0430\u043a\u0438\u0435-\u0442\u043e DDL \u0438\u043b\u0438 DML \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u044f> SVC_LOG_SQL_EXCEPTION_AND_RETURN<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 cpp \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 -D SQL_DB_INSTANCE=schema_name, \u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b cpp \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u043c \u0432\u044b\u0448\u0435 Perl \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u043c.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u0435\u043c\u0430 \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u0430, \u043c\u043e\u0433\u0443 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0440\u044f\u0434 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0434\u043e\u0447\u0438\u0442\u0430\u043b\u0438!<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/818775\/\"> https:\/\/habr.com\/ru\/articles\/818775\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-377673","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/377673","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=377673"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/377673\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=377673"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=377673"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=377673"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}