feat: add pssql triggers to analyser

This commit is contained in:
Nybkox
2024-12-12 18:12:10 +01:00
parent 92e13220d8
commit 4cc0a66a7d
4 changed files with 62 additions and 1 deletions

View File

@@ -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;

View File

@@ -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 });

View File

@@ -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,
};

View File

@@ -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
`;