diff --git a/packages/types/dbinfo.d.ts b/packages/types/dbinfo.d.ts index 3a50fbbfd..0cf0794b4 100644 --- a/packages/types/dbinfo.d.ts +++ b/packages/types/dbinfo.d.ts @@ -136,7 +136,15 @@ export interface FunctionInfo extends CallableObjectInfo { returnType?: string; } -export interface TriggerInfo extends SqlObjectInfo {} +export interface TriggerInfo extends SqlObjectInfo { + objectId: string; + trigerName: string; + functionName?: string; + tableName: string; + triggerTiming?: 'BEFORE' | 'AFTER' | 'INSTEAD OF' | null; + triggerLevel?: 'ROW' | 'STATEMENT'; + eventType?: 'INSERT' | 'UPDATE' | 'DELETE' | 'TRUNCATE'; +} export interface SchemaInfo { objectId?: string; diff --git a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js index 2823ade51..428fef847 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/Analyser.js +++ b/plugins/dbgate-plugin-postgres/src/backend/Analyser.js @@ -241,6 +241,8 @@ class Analyser extends DatabaseAnalyser { return acc; }, {}); + const triggers = await this.analyserQuery('triggers'); + const res = { tables: tables.rows.map(table => { const newTable = { @@ -348,6 +350,18 @@ class Analyser extends DatabaseAnalyser { parameters: functionNameToParameters[`${func.schema_name}.${func.pure_name}`], returnType: func.data_type, })), + triggers: triggers.rows.map(row => ({ + trigerName: row.trigger_name, + functionName: row.function_name, + triggerTiming: row.trigger_timing, + triggerLevel: row.trigger_level, + eventType: row.event_type, + schemaName: row.schema_name, + tableName: row.table_name, + createSql: row.definition, + contentHash: `triggers:${row.trigger_id}`, + objectId: `triggers:${row.trigger_id}`, + })), }; this.feedback({ analysingMessage: null }); diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js index e57203fe9..8f648c64f 100644 --- a/plugins/dbgate-plugin-postgres/src/backend/sql/index.js +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/index.js @@ -16,6 +16,8 @@ const geometryColumns = require('./geometryColumns'); const geographyColumns = require('./geographyColumns'); const proceduresParameters = require('./proceduresParameters'); const foreignKeys = require('./foreignKeys'); +const triggers = require('./triggers'); + const fk_keyColumnUsage = require('./fk_key_column_usage'); module.exports = { @@ -38,4 +40,5 @@ module.exports = { geometryColumns, geographyColumns, proceduresParameters, + triggers, }; diff --git a/plugins/dbgate-plugin-postgres/src/backend/sql/triggers.js b/plugins/dbgate-plugin-postgres/src/backend/sql/triggers.js new file mode 100644 index 000000000..6b8cdd781 --- /dev/null +++ b/plugins/dbgate-plugin-postgres/src/backend/sql/triggers.js @@ -0,0 +1,36 @@ +module.exports = ` +SELECT + t.oid AS trigger_id, + t.tgname AS trigger_name, + n.nspname AS schema_name, + c.relname AS table_name, + p.proname AS function_name, + t.tgtype AS original_tgtype, + CASE + WHEN t.tgtype & 1 = 1 THEN 'ROW' + ELSE 'STATEMENT' + END AS trigger_level, + CASE + WHEN tgtype & 2 = 2 THEN 'AFTER' + WHEN tgtype & 1 = 1 THEN 'BEFORE' + ELSE NULL + END AS trigger_timing, + CASE + WHEN tgtype & 32 = 32 THEN 'TRUNCATE' + WHEN tgtype & 16 = 16 THEN 'UPDATE' + WHEN tgtype & 8 = 8 THEN 'DELETE' + WHEN tgtype & 4 = 4 THEN 'INSERT' + ELSE NULL + END AS event_type, + pg_get_triggerdef(t.oid) AS definition +FROM + pg_trigger t +JOIN + pg_class c ON c.oid = t.tgrelid +JOIN + pg_namespace n ON n.oid = c.relnamespace +JOIN + pg_proc p ON p.oid = t.tgfoid +WHERE + NOT t.tgisinternal AND n.nspname =SCHEMA_NAME_CONDITION +`;