triggers fetches user-defined triggers from the database
()
| 654 | |
| 655 | // triggers fetches user-defined triggers from the database |
| 656 | func (d *PostgresDatabase) triggers() ([]string, error) { |
| 657 | // Query to get user-defined triggers (excluding internal triggers and extension triggers) |
| 658 | // We use pg_get_triggerdef to get the complete trigger definition |
| 659 | rows, err := d.db.Query(` |
| 660 | SELECT n.nspname AS trigger_schema, |
| 661 | c.relname AS table_name, |
| 662 | t.tgname AS trigger_name, |
| 663 | pg_get_triggerdef(t.oid) AS trigger_def, |
| 664 | obj_description(t.oid, 'pg_trigger') AS trigger_comment |
| 665 | FROM pg_catalog.pg_trigger t |
| 666 | INNER JOIN pg_catalog.pg_class c ON t.tgrelid = c.oid |
| 667 | INNER JOIN pg_catalog.pg_namespace n ON c.relnamespace = n.oid |
| 668 | WHERE n.nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast', 'sys') |
| 669 | AND NOT t.tgisinternal |
| 670 | AND NOT EXISTS (SELECT 1 FROM pg_depend d WHERE d.objid = t.oid AND d.classid = (SELECT oid FROM pg_catalog.pg_class WHERE relname = 'pg_trigger') AND d.deptype = 'e') |
| 671 | ORDER BY n.nspname, c.relname, t.tgname; |
| 672 | `) |
| 673 | if err != nil { |
| 674 | return nil, err |
| 675 | } |
| 676 | defer rows.Close() |
| 677 | |
| 678 | var ddls []string |
| 679 | for rows.Next() { |
| 680 | var triggerSchema, tableName, triggerName, triggerDef string |
| 681 | var triggerComment sql.NullString |
| 682 | if err := rows.Scan(&triggerSchema, &tableName, &triggerName, &triggerDef, &triggerComment); err != nil { |
| 683 | return nil, err |
| 684 | } |
| 685 | if d.config.TargetSchema != nil && !slices.Contains(d.config.TargetSchema, triggerSchema) { |
| 686 | continue |
| 687 | } |
| 688 | // pg_get_triggerdef returns the complete CREATE TRIGGER statement |
| 689 | // We just need to ensure it ends with a semicolon |
| 690 | triggerDef = strings.TrimSpace(triggerDef) |
| 691 | if !strings.HasSuffix(triggerDef, ";") { |
| 692 | triggerDef += ";" |
| 693 | } |
| 694 | ddls = append(ddls, triggerDef) |
| 695 | |
| 696 | // Add comment if exists |
| 697 | if triggerComment.Valid { |
| 698 | ddls = append(ddls, fmt.Sprintf( |
| 699 | "COMMENT ON TRIGGER %s ON %s.%s IS %s;", |
| 700 | d.quoteIdentifierIfNeeded(triggerName), d.quoteIdentifierIfNeeded(triggerSchema), d.quoteIdentifierIfNeeded(tableName), schemaLib.StringConstant(triggerComment.String), |
| 701 | )) |
| 702 | } |
| 703 | } |
| 704 | if err := rows.Err(); err != nil { |
| 705 | return nil, err |
| 706 | } |
| 707 | return ddls, nil |
| 708 | } |
| 709 | |
| 710 | // CheckConstraint holds a CHECK constraint's name and definition. |
| 711 | type CheckConstraint struct { |
no test coverage detected