bytebase/bytebase · error

failed to get trigger comments

Error message

failed to get trigger comments

What it means

getTriggers failed while fetching trigger comments from the Oracle catalog. getTriggerComments queries sys triggers/comments views (e.g. all_triggers with description/body) and any error is wrapped as 'failed to get trigger comments'. The whole trigger sync — and thus SyncDBSchema — aborts.

Source

Thrown at backend/plugin/db/oracle/sync.go:235

	}
	if err := rows.Err(); err != nil {
		return nil, util.FormatErrorWithQuery(err, query)
	}
	if err := rows.Close(); err != nil {
		return nil, errors.Wrapf(err, "failed to close rows")
	}

	return result, nil
}

func getTriggers(txn *sql.Tx, schemaName string) (map[db.TableKey][]*storepb.TriggerMetadata, map[db.TableKey][]*storepb.TriggerMetadata, error) {
	tableTriggerMap := make(map[db.TableKey][]*storepb.TriggerMetadata)
	viewTriggerMap := make(map[db.TableKey][]*storepb.TriggerMetadata)

	// Get trigger comments
	triggerCommentMap, err := getTriggerComments(txn, schemaName)
	if err != nil {
		return nil, nil, errors.Wrapf(err, "failed to get trigger comments")
	}

	query := fmt.Sprintf(`
		SELECT TRIGGER_NAME, TABLE_NAME, DESCRIPTION, TRIGGER_BODY, BASE_OBJECT_TYPE, TRIGGER_TYPE, TRIGGERING_EVENT
		FROM sys.all_triggers
		WHERE OWNER = '%s' AND TABLE_NAME is NOT NULL AND (BASE_OBJECT_TYPE = 'TABLE' OR BASE_OBJECT_TYPE = 'VIEW')
		ORDER BY TRIGGER_NAME`, schemaName)

	slog.Debug("running get triggers query")
	rows, err := txn.Query(query)
	if err != nil {
		return nil, nil, util.FormatErrorWithQuery(err, query)
	}
	defer rows.Close()

	for rows.Next() {
		var triggerName, tableName, description, triggerBody, baseObjectType, triggerType, triggeringEvent sql.NullString
		if err := rows.Scan(&triggerName, &tableName, &description, &triggerBody, &baseObjectType, &triggerType, &triggeringEvent); err != nil {

View on GitHub (pinned to 1870550677)

Solutions

  1. Inspect the wrapped inner error (includes the query) and run it manually as the sync user
  2. Grant SELECT on sys.all_triggers and sys.all_source to the sync user
  3. Verify the configured schemaName is a valid, correctly-cased Oracle username
  4. Retry if the inner error indicates a transient connection problem

Example fix

// before
-- query interpolated as WHERE OWNER = 'my schema'
// after — use a valid, unquoted schema identifier in the instance config
-- GRANT SELECT ON sys.all_triggers TO sync_user;
Defensive patterns

Strategy: validation

Validate before calling

var n int
if err := db.QueryRow("SELECT COUNT(*) FROM sys.all_triggers WHERE ROWNUM = 1").Scan(&n); err != nil {
    // grant SELECT ON sys.all_triggers before running sync
}
// also validate schemaName is a plain Oracle identifier
if !regexp.MustCompile(`^[A-Za-z][A-Za-z0-9_$#]*$`).MatchString(schemaName) { /* reject */ }

Type guard

func validOracleIdentifier(s string) bool {
    re := regexp.MustCompile(`^[A-Za-z][A-Za-z0-9_$#]{0,29}$`)
    return re.MatchString(s)
}

Try / catch

tableTriggers, viewTriggers, err := getTriggers(txn, schemaName)
if err != nil {
    if isPrivilegeError(err) { return fmt.Errorf("grant SELECT on trigger catalog views: %w", err) }
    return err
}

Prevention

When it happens

Trigger: SyncDBSchema on a schema with triggers where the trigger-comment catalog query fails: missing privileges on the trigger catalog views, an invalid schemaName (empty/quoted wrongly interpolated into the query), or a mid-query connection failure.

Common situations: Sync user without grants on all_triggers/all_source; schema name containing characters that break the fmt.Sprintf-interpolated WHERE OWNER = '%s' clause; connection drop during trigger scan.

Understand the failure class

Background: Database query failed: Internal Server Error 500s wrapping SQL, Prisma, and connection failures — what to check first — this error's family across 16 libraries.

Related errors


AI-assisted analysis of bytebase/bytebase@1870550677 (2026-09-06). Data as JSON: /api/errors/eb1eeaacd2c5b992. Report an issue: GitHub.