(txn *sql.Tx, schemaName string)
| 215 | } |
| 216 | |
| 217 | func getTriggers(txn *sql.Tx, schemaName string) (map[db.TableKey][]*storepb.TriggerMetadata, map[db.TableKey][]*storepb.TriggerMetadata, error) { |
| 218 | tableTriggerMap := make(map[db.TableKey][]*storepb.TriggerMetadata) |
| 219 | viewTriggerMap := make(map[db.TableKey][]*storepb.TriggerMetadata) |
| 220 | |
| 221 | // Get trigger comments |
| 222 | triggerCommentMap, err := getTriggerComments(txn, schemaName) |
| 223 | if err != nil { |
| 224 | return nil, nil, errors.Wrapf(err, "failed to get trigger comments") |
| 225 | } |
| 226 | |
| 227 | query := fmt.Sprintf(` |
| 228 | SELECT TRIGGER_NAME, TABLE_NAME, DESCRIPTION, TRIGGER_BODY, BASE_OBJECT_TYPE, TRIGGER_TYPE, TRIGGERING_EVENT |
| 229 | FROM sys.all_triggers |
| 230 | WHERE OWNER = '%s' AND TABLE_NAME is NOT NULL AND (BASE_OBJECT_TYPE = 'TABLE' OR BASE_OBJECT_TYPE = 'VIEW') |
| 231 | ORDER BY TRIGGER_NAME`, schemaName) |
| 232 | |
| 233 | slog.Debug("running get triggers query") |
| 234 | rows, err := txn.Query(query) |
| 235 | if err != nil { |
| 236 | return nil, nil, util.FormatErrorWithQuery(err, query) |
| 237 | } |
| 238 | defer rows.Close() |
| 239 | |
| 240 | for rows.Next() { |
| 241 | var triggerName, tableName, description, triggerBody, baseObjectType, triggerType, triggeringEvent sql.NullString |
| 242 | if err := rows.Scan(&triggerName, &tableName, &description, &triggerBody, &baseObjectType, &triggerType, &triggeringEvent); err != nil { |
| 243 | return nil, nil, err |
| 244 | } |
| 245 | if !triggerName.Valid || !tableName.Valid || !description.Valid || !triggerBody.Valid || !baseObjectType.Valid { |
| 246 | continue |
| 247 | } |
| 248 | key := db.TableKey{Schema: schemaName, Table: tableName.String} |
| 249 | trigger := &storepb.TriggerMetadata{ |
| 250 | Name: triggerName.String, |
| 251 | Body: constructTriggerBody(description.String, triggerBody.String), |
| 252 | } |
| 253 | if triggerType.Valid { |
| 254 | trigger.Timing = triggerType.String |
| 255 | } |
| 256 | if triggeringEvent.Valid { |
| 257 | trigger.Event = triggeringEvent.String |
| 258 | } |
| 259 | // Add trigger comment if available |
| 260 | triggerKey := db.TableKey{Schema: schemaName, Table: triggerName.String} |
| 261 | if comment, ok := triggerCommentMap[triggerKey]; ok { |
| 262 | trigger.Comment = comment |
| 263 | } |
| 264 | |
| 265 | if baseObjectType.String == "TABLE" { |
| 266 | tableTriggerMap[key] = append(tableTriggerMap[key], trigger) |
| 267 | } else { |
| 268 | viewTriggerMap[key] = append(viewTriggerMap[key], trigger) |
| 269 | } |
| 270 | } |
| 271 | if err := rows.Err(); err != nil { |
| 272 | return nil, nil, util.FormatErrorWithQuery(err, query) |
| 273 | } |
| 274 |
no test coverage detected