Hi, Please find the attached patch to fix RM #2933 - Add support for transition tables in Postgres 10 triggers.
Thanks, Khushboo
diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/create.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/create.sql new file mode 100644 index 0000000..b26ab41 --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/create.sql @@ -0,0 +1,36 @@ +{### Set a flag which allows us to put OR between events ###} +{% set or_flag = False %} +{% if data.lanname == 'edbspl' or data.tfunction == 'Inline EDB-SPL' %} +CREATE OR REPLACE TRIGGER {{ conn|qtIdent(data.name) }} +{% else %} +CREATE{% if data.is_constraint_trigger %} CONSTRAINT{% endif %} TRIGGER {{ conn|qtIdent(data.name) }} +{% endif %} + {{data.fires}} {% if data.evnt_insert %}INSERT{% set or_flag = True %} +{% endif %}{% if data.evnt_delete %} +{% if or_flag %} OR {% endif %}DELETE{% set or_flag = True %} +{% endif %}{% if data.evnt_truncate %} +{% if or_flag %} OR {% endif %}TRUNCATE{% set or_flag = True %} +{% endif %}{% if data.evnt_update %} +{% if or_flag %} OR {% endif %}UPDATE {% if data.columns|length > 0 %}OF {% for c in data.columns %}{% if loop.index != 1 %}, {% endif %}{{ conn|qtIdent(c) }}{% endfor %}{% endif %} +{% endif %} + + ON {{ conn|qtIdent(data.schema, data.table) }} +{% if data.tgdeferrable %} + DEFERRABLE{% if data.tginitdeferred %} INITIALLY DEFERRED{% endif %} +{% endif %} +{% if data.tgoldtable or data.tgnewtable %} + REFERENCING{% if data.tgnewtable %} NEW TABLE AS {{ conn|qtIdent(data.tgnewtable) }}{% endif %}{% if data.tgoldtable %} OLD TABLE AS {{ conn|qtIdent(data.tgoldtable) }}{% endif %} + +{% endif %} + FOR EACH{% if data.is_row_trigger %} ROW{% else %} STATEMENT{% endif %} +{% if data.whenclause %} + + WHEN {{ data.whenclause }}{% endif %} + + {% if data.prosrc is defined and + (data.lanname == 'edbspl' or data.tfunction == 'Inline EDB-SPL') %}{{ data.prosrc }}{% else %}EXECUTE PROCEDURE {{ data.tfunction }}{% if data.tgargs %}({{ data.tgargs }}){% else %}(){% endif%}{% endif%}; + +{% if data.description %} +COMMENT ON TRIGGER {{ conn|qtIdent(data.name) }} ON {{ conn|qtIdent(data.schema, data.table) }} + IS {{data.description|qtLiteral}}; +{% endif %} diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/properties.sql b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/properties.sql new file mode 100644 index 0000000..1a7da0f --- /dev/null +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/templates/trigger/sql/10_plus/properties.sql @@ -0,0 +1,25 @@ +SELECT t.oid,t.tgname AS name, t.xmin, t.*, relname, CASE WHEN relkind = 'r' THEN TRUE ELSE FALSE END AS parentistable, + nspname, des.description, l.lanname, p.prosrc, p.proname AS tfunction, + COALESCE(substring(pg_get_triggerdef(t.oid), 'WHEN (.*) EXECUTE PROCEDURE'), + substring(pg_get_triggerdef(t.oid), 'WHEN (.*) \\$trigger')) AS whenclause, + -- We need to convert tgargs column bytea datatype to array datatype + (string_to_array(encode(tgargs, 'escape'), '\000')::text[])[1:tgnargs] AS custom_tgargs, +{% if datlastsysoid %} + (CASE WHEN t.oid <= {{ datlastsysoid}}::oid THEN true ElSE false END) AS is_sys_trigger, +{% endif %} + (CASE WHEN tgconstraint != 0::OID THEN true ElSE false END) AS is_constarint, + (CASE WHEN tgenabled = 'O' THEN true ElSE false END) AS is_enable_trigger, + tgoldtable, + tgnewtable +FROM pg_trigger t + JOIN pg_class cl ON cl.oid=tgrelid + JOIN pg_namespace na ON na.oid=relnamespace + LEFT OUTER JOIN pg_description des ON (des.objoid=t.oid AND des.classoid='pg_trigger'::regclass) + LEFT OUTER JOIN pg_proc p ON p.oid=t.tgfoid + LEFT OUTER JOIN pg_language l ON l.oid=p.prolang +WHERE NOT tgisinternal + AND tgrelid = {{tid}}::OID +{% if trid %} + AND t.oid = {{trid}}::OID +{% endif %} +ORDER BY tgname; diff --git a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js index 843ff11..351682f 100644 --- a/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js +++ b/web/pgadmin/browser/server_groups/servers/databases/schemas/tables/triggers/static/js/trigger.js @@ -467,6 +467,18 @@ define('pgadmin.node.trigger', [ return true; } },{ + id: 'tgoldtable', label: gettext('Old table'), + type: 'text', group: gettext('Transition'), + cell: 'string', mode: ['create', 'edit', 'properties'], + deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'], + disabled: 'disableTransition' + },{ + id: 'tgnewtable', label: gettext('New table'), + type: 'text', group: gettext('Transition'), + cell: 'string', mode: ['create', 'edit', 'properties'], + deps: ['fires', 'is_constraint_trigger', 'evnt_insert', 'evnt_update', 'evnt_delete', 'columns'], + disabled: 'disableTransition' + },{ id: 'prosrc', label: gettext('Code'), group: gettext('Code'), type: 'text', mode: ['create', 'edit'], deps: ['tfunction'], control: 'sql-field', visible: true, @@ -575,6 +587,47 @@ define('pgadmin.node.trigger', [ } } return true; + }, + // Disable/Enable Transition tables + disableTransition: function(m) { + var flag = true, + evnt = null, + name = this.name, + evnt_count = 0; + + // Disable transition tables for view trigger and PG version < 100000 + if(_.indexOf(Object.keys(m.node_info), 'table') == -1 || + m.node_info.server.version < 100000) return true; + + if (name == "tgoldtable") evnt = 'evnt_delete'; + else if (name == "tgnewtable") evnt = 'evnt_insert'; + + if(m.get('evnt_insert')) evnt_count++; + if(m.get('evnt_update')) evnt_count++; + if(m.get('evnt_delete')) evnt_count++; + + + // Disable transition tables if + // - It is a constraint trigger + // - Fires other than AFTER + // - More than one events enabled + // - Update event with the column list + + // Disable Old transition table if both UPDATE and DELETE events are disabled + // Disable New transition table if both UPDATE and INSERT events are disabled + if(!m.get('is_constraint_trigger') && m.get('fires') == 'AFTER' && + (m.get('evnt_update') || m.get(evnt)) && evnt_count == 1) { + if (m.get('evnt_update') && (_.size(m.get('columns')) >= 1 && m.get('columns')[0] != "")) flag = true; + else flag = false; + } + + flag && setTimeout(function() { + if(m.get(name)) { + m.set(name, null); + } + },10); + + return flag; } }), // Below function will enable right click menu for creating column