Files
metabase/resources/liquibase_legacy_migrations.yaml
2026-03-10 16:58:26 -05:00

12068 lines
412 KiB
YAML

# *** IMPORTANT: new migrations should be placed in 001_update_migrations.yml ***
#
# This file contains the legacy migrations that used to bootstrap metabase, now this file should be
# replaced with the SQL file in resources/initialization.
# In order to keep instances running metabase < 45 able to upgrade to the latest, we need to keep this file here.
databaseChangeLog:
- logicalFilePath: migrations/000_legacy_migrations.yaml
- property:
name: timestamp_type
value: timestamp with time zone
dbms: postgresql,h2
- property:
name: timestamp_type
value: timestamp(6)
dbms: mysql,mariadb
- property:
name: blob.type
value: blob
dbms: mysql,h2,mariadb
- property:
name: blob.type
value: bytea
dbms: postgresql
# In MySQL, use LONGTEXT instead of TEXT (#7006)
- property:
name: text.type
value: text
dbms: postgresql,h2
- property:
name: text.type
value: longtext
dbms: mysql,mariadb
# databasechangelog is uppercase in MySQL and H2 but lower-case in Postgres for reasons
- property:
name: databasechangelog.name
value: DATABASECHANGELOG
dbms: h2,mysql,mariadb
- property:
name: databasechangelog.name
value: databasechangelog
dbms: postgresql
- objectQuotingStrategy: QUOTE_ALL_OBJECTS
- changeSet:
id: '1'
author: agilliland
validCheckSum: ANY
changes:
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
unique: true
name: slug
type: varchar(254)
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: description
type: text
- column:
name: logo_url
type: varchar(254)
- column:
constraints:
nullable: false
name: inherits
type: boolean
tableName: core_organization
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
unique: true
name: email
type: varchar(254)
- column:
constraints:
nullable: false
name: first_name
type: varchar(254)
- column:
constraints:
nullable: false
name: last_name
type: varchar(254)
- column:
constraints:
nullable: false
name: password
type: varchar(254)
- column:
constraints:
nullable: false
defaultValue: default
name: password_salt
type: varchar(254)
- column:
constraints:
nullable: false
name: date_joined
type: DATETIME
- column:
constraints:
nullable: true
name: last_login
type: DATETIME
- column:
constraints:
nullable: false
name: is_staff
type: boolean
- column:
constraints:
nullable: false
name: is_superuser
type: boolean
- column:
constraints:
nullable: false
name: is_active
type: boolean
- column:
name: reset_token
type: varchar(254)
- column:
name: reset_triggered
type: BIGINT
tableName: core_user
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: admin
type: boolean
- column:
constraints:
deferrable: false
foreignKeyName: fk_userorgperm_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: user_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_userorgperm_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
tableName: core_userorgperm
- addUniqueConstraint:
columnNames: user_id, organization_id
constraintName: idx_unique_user_id_organization_id
tableName: core_userorgperm
- createIndex:
columns:
- column:
name: user_id
type: int
indexName: idx_userorgperm_user_id
tableName: core_userorgperm
- createIndex:
columns:
- column:
name: organization_id
type: int
indexName: idx_userorgperm_organization_id
tableName: core_userorgperm
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: url
type: varchar(254)
- column:
constraints:
nullable: false
name: timestamp
type: DATETIME
- column:
constraints:
deferrable: false
foreignKeyName: fk_permissionviolation_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: user_id
type: int
tableName: core_permissionsviolation
- createIndex:
columns:
- column:
name: user_id
type: int
indexName: idx_permissionsviolation_user_id
tableName: core_permissionsviolation
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: description
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_database_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
- column:
name: details
type: text
- column:
constraints:
nullable: false
name: engine
type: varchar(254)
tableName: metabase_database
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_database_organization_id
tableName: metabase_database
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: rows
type: int
- column:
name: description
type: text
- column:
name: entity_name
type: varchar(254)
- column:
name: entity_type
type: varchar(254)
- column:
constraints:
nullable: false
name: active
type: boolean
- column:
constraints:
deferrable: false
foreignKeyName: fk_table_ref_database_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_database
referencedColumnNames: id
name: db_id
type: int
tableName: metabase_table
- createIndex:
columns:
- column:
name: db_id
indexName: idx_table_db_id
tableName: metabase_table
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
constraints:
nullable: false
name: base_type
type: varchar(255)
- column:
name: special_type
type: varchar(255)
- column:
constraints:
nullable: false
name: active
type: boolean
- column:
name: description
type: text
- column:
constraints:
nullable: false
name: preview_display
type: boolean
- column:
constraints:
nullable: false
name: position
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_field_ref_table_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_table
referencedColumnNames: id
name: table_id
type: int
- column:
constraints:
nullable: false
name: field_type
type: varchar(254)
tableName: metabase_field
- createIndex:
columns:
- column:
name: table_id
indexName: idx_field_table_id
tableName: metabase_field
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: relationship
type: varchar(254)
- column:
constraints:
deferrable: false
foreignKeyName: fk_foreignkey_dest_ref_field_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_field
referencedColumnNames: id
name: destination_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_foreignkey_origin_ref_field_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_field
referencedColumnNames: id
name: origin_id
type: int
tableName: metabase_foreignkey
- createIndex:
columns:
- column:
name: destination_id
indexName: idx_foreignkey_destination_id
tableName: metabase_foreignkey
- createIndex:
columns:
- column:
name: origin_id
indexName: idx_foreignkey_origin_id
tableName: metabase_foreignkey
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
name: values
type: text
- column:
name: human_readable_values
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_fieldvalues_ref_field_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_field
referencedColumnNames: id
name: field_id
type: int
tableName: metabase_fieldvalues
- createIndex:
columns:
- column:
name: field_id
indexName: idx_fieldvalues_field_id
tableName: metabase_fieldvalues
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
constraints:
deferrable: false
foreignKeyName: fk_tablesegment_ref_table_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_table
referencedColumnNames: id
name: table_id
type: int
- column:
constraints:
nullable: false
name: filter_clause
type: text
tableName: metabase_tablesegment
- createIndex:
columns:
- column:
name: table_id
indexName: idx_tablesegment_table_id
tableName: metabase_tablesegment
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
constraints:
nullable: false
name: type
type: varchar(254)
- column:
constraints:
nullable: false
name: details
type: text
- column:
constraints:
nullable: false
name: version
type: int
- column:
constraints:
nullable: false
name: public_perms
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_query_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_query_ref_database_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_database
referencedColumnNames: id
name: database_id
type: int
tableName: query_query
- createIndex:
columns:
- column:
name: creator_id
indexName: idx_query_creator_id
tableName: query_query
- createIndex:
columns:
- column:
name: database_id
indexName: idx_query_database_id
tableName: query_query
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
unique: true
name: uuid
type: varchar(254)
- column:
constraints:
nullable: false
name: version
type: int
- column:
constraints:
nullable: false
name: json_query
type: text
- column:
constraints:
nullable: false
name: raw_query
type: text
- column:
constraints:
nullable: false
name: status
type: varchar(254)
- column:
constraints:
nullable: false
name: started_at
type: DATETIME
- column:
name: finished_at
type: DATETIME
- column:
constraints:
nullable: false
name: running_time
type: int
- column:
constraints:
nullable: false
name: error
type: text
- column:
constraints:
nullable: false
name: result_file
type: varchar(254)
- column:
constraints:
nullable: false
name: result_rows
type: int
- column:
constraints:
nullable: false
name: result_data
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_queryexecution_ref_query_id
initiallyDeferred: false
nullable: true
referencedTableName: query_query
referencedColumnNames: id
name: query_id
type: int
- column:
constraints:
nullable: false
name: additional_info
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_queryexecution_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: executor_id
type: int
tableName: query_queryexecution
- createIndex:
columns:
- column:
name: query_id
indexName: idx_queryexecution_query_id
tableName: query_queryexecution
- createIndex:
columns:
- column:
name: executor_id
indexName: idx_queryexecution_executor_id
tableName: query_queryexecution
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: description
type: text
- column:
constraints:
nullable: false
name: display
type: varchar(254)
- column:
constraints:
nullable: false
name: public_perms
type: int
- column:
constraints:
nullable: false
name: dataset_query
type: text
- column:
constraints:
nullable: false
name: visualization_settings
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_card_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_card_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
tableName: report_card
- createIndex:
columns:
- column:
name: creator_id
indexName: idx_card_creator_id
tableName: report_card
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_card_organization_id
tableName: report_card
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
deferrable: false
foreignKeyName: fk_cardfavorite_ref_card_id
initiallyDeferred: false
nullable: false
referencedTableName: report_card
referencedColumnNames: id
name: card_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_cardfavorite_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: owner_id
type: int
tableName: report_cardfavorite
- addUniqueConstraint:
columnNames: card_id, owner_id
constraintName: idx_unique_cardfavorite_card_id_owner_id
tableName: report_cardfavorite
- createIndex:
columns:
- column:
name: card_id
indexName: idx_cardfavorite_card_id
tableName: report_cardfavorite
- createIndex:
columns:
- column:
name: owner_id
indexName: idx_cardfavorite_owner_id
tableName: report_cardfavorite
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: description
type: text
- column:
constraints:
nullable: false
name: public_perms
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboard_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboard_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
tableName: report_dashboard
- createIndex:
columns:
- column:
name: creator_id
indexName: idx_dashboard_creator_id
tableName: report_dashboard
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_dashboard_organization_id
tableName: report_dashboard
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: sizeX
type: int
- column:
constraints:
nullable: false
name: sizeY
type: int
- column:
name: row
type: int
- column:
name: col
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboardcard_ref_card_id
initiallyDeferred: false
nullable: false
referencedTableName: report_card
referencedColumnNames: id
name: card_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboardcard_ref_dashboard_id
initiallyDeferred: false
nullable: false
referencedTableName: report_dashboard
referencedColumnNames: id
name: dashboard_id
type: int
tableName: report_dashboardcard
- createIndex:
columns:
- column:
name: card_id
indexName: idx_dashboardcard_card_id
tableName: report_dashboardcard
- createIndex:
columns:
- column:
name: dashboard_id
indexName: idx_dashboardcard_dashboard_id
tableName: report_dashboardcard
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboardsubscription_ref_dashboard_id
initiallyDeferred: false
nullable: false
referencedTableName: report_dashboard
referencedColumnNames: id
name: dashboard_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_dashboardsubscription_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: user_id
type: int
tableName: report_dashboardsubscription
- addUniqueConstraint:
columnNames: dashboard_id, user_id
constraintName: idx_uniq_dashsubscrip_dashboard_id_user_id
tableName: report_dashboardsubscription
- createIndex:
columns:
- column:
name: dashboard_id
indexName: idx_dashboardsubscription_dashboard_id
tableName: report_dashboardsubscription
- createIndex:
columns:
- column:
name: user_id
indexName: idx_dashboardsubscription_user_id
tableName: report_dashboardsubscription
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: name
type: varchar(254)
- column:
name: description
type: text
- column:
constraints:
nullable: false
name: public_perms
type: int
- column:
constraints:
nullable: false
name: mode
type: int
- column:
constraints:
nullable: false
name: version
type: int
- column:
constraints:
nullable: false
name: dataset_query
type: text
- column:
name: email_addresses
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreport_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreport_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
- column:
constraints:
nullable: false
name: schedule
type: text
tableName: report_emailreport
- createIndex:
columns:
- column:
name: creator_id
indexName: idx_emailreport_creator_id
tableName: report_emailreport
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_emailreport_organization_id
tableName: report_emailreport
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreport_recipients_ref_emailreport_id
initiallyDeferred: false
nullable: false
referencedTableName: report_emailreport
referencedColumnNames: id
name: emailreport_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreport_recipients_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: user_id
type: int
tableName: report_emailreport_recipients
- addUniqueConstraint:
columnNames: emailreport_id, user_id
constraintName: idx_uniq_emailreportrecip_emailreport_id_user_id
tableName: report_emailreport_recipients
- createIndex:
columns:
- column:
name: emailreport_id
indexName: idx_emailreport_recipients_emailreport_id
tableName: report_emailreport_recipients
- createIndex:
columns:
- column:
name: user_id
indexName: idx_emailreport_recipients_user_id
tableName: report_emailreport_recipients
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: details
type: text
- column:
constraints:
nullable: false
name: status
type: varchar(254)
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
name: started_at
type: DATETIME
- column:
name: finished_at
type: DATETIME
- column:
constraints:
nullable: false
name: error
type: text
- column:
constraints:
nullable: false
name: sent_email
type: text
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreportexecutions_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_emailreportexecutions_ref_report_id
initiallyDeferred: false
nullable: true
referencedTableName: report_emailreport
referencedColumnNames: id
name: report_id
type: int
tableName: report_emailreportexecutions
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_emailreportexecutions_organization_id
tableName: report_emailreportexecutions
- createIndex:
columns:
- column:
name: report_id
indexName: idx_emailreportexecutions_report_id
tableName: report_emailreportexecutions
- createTable:
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
- column:
constraints:
nullable: false
name: updated_at
type: DATETIME
- column:
constraints:
nullable: false
name: start
type: DATETIME
- column:
constraints:
nullable: false
name: end
type: DATETIME
- column:
name: title
type: TEXT
- column:
constraints:
nullable: false
name: body
type: TEXT
- column:
constraints:
nullable: false
name: annotation_type
type: int
- column:
constraints:
nullable: false
name: edit_count
type: int
- column:
constraints:
nullable: false
name: object_type_id
type: int
- column:
constraints:
nullable: false
name: object_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_annotation_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: author_id
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_annotation_ref_organization_id
initiallyDeferred: false
nullable: false
referencedTableName: core_organization
referencedColumnNames: id
name: organization_id
type: int
tableName: annotation_annotation
- createIndex:
columns:
- column:
name: author_id
indexName: idx_annotation_author_id
tableName: annotation_annotation
- createIndex:
columns:
- column:
name: organization_id
indexName: idx_annotation_organization_id
tableName: annotation_annotation
- createIndex:
columns:
- column:
name: object_type_id
indexName: idx_annotation_object_type_id
tableName: annotation_annotation
- createIndex:
columns:
- column:
name: object_id
indexName: idx_annotation_object_id
tableName: annotation_annotation
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: '2'
author: agilliland
validCheckSum: ANY
changes:
- createTable:
columns:
- column:
constraints:
nullable: false
primaryKey: true
name: id
type: varchar(254)
- column:
constraints:
deferrable: false
foreignKeyName: fk_session_ref_user_id
initiallyDeferred: false
nullable: false
referencedTableName: core_user
referencedColumnNames: id
name: user_id
type: int
- column:
constraints:
nullable: false
name: created_at
type: DATETIME
tableName: core_session
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: '4'
author: cammsaul
changes:
- createTable:
columns:
- column:
constraints:
nullable: false
primaryKey: true
name: key
type: varchar(254)
- column:
constraints:
nullable: false
name: value
type: varchar(254)
tableName: setting
- changeSet:
id: '5'
author: agilliland
changes:
- addColumn:
columns:
- column:
name: report_timezone
type: varchar(254)
tableName: core_organization
- changeSet:
id: '6'
author: agilliland
changes:
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: metabase_database
- dropForeignKeyConstraint:
baseTableName: metabase_database
constraintName: fk_database_ref_organization_id
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: report_card
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_card_ref_organization_id
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: report_dashboard
- dropForeignKeyConstraint:
baseTableName: report_dashboard
constraintName: fk_dashboard_ref_organization_id
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: report_emailreport
- dropForeignKeyConstraint:
baseTableName: report_emailreport
constraintName: fk_emailreport_ref_organization_id
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: report_emailreportexecutions
- dropForeignKeyConstraint:
baseTableName: report_emailreportexecutions
constraintName: fk_emailreportexecutions_ref_organization_id
- dropNotNullConstraint:
columnDataType: int
columnName: organization_id
tableName: annotation_annotation
- dropForeignKeyConstraint:
baseTableName: annotation_annotation
constraintName: fk_annotation_ref_organization_id
- changeSet:
id: '7'
author: cammsaul
validCheckSum: ANY
changes:
- addColumn:
columns:
- column:
constraints:
foreignKeyName: fk_field_parent_ref_field_id
nullable: true
referencedTableName: metabase_field
referencedColumnNames: id
name: parent_id
type: int
tableName: metabase_field
- changeSet:
id: '8'
author: tlrobinson
changes:
- addColumn:
columns:
- column:
name: display_name
type: varchar(254)
tableName: metabase_table
- addColumn:
columns:
- column:
name: display_name
type: varchar(254)
tableName: metabase_field
- changeSet:
id: '9'
author: tlrobinson
changes:
- addColumn:
columns:
- column:
name: visibility_type
type: varchar(254)
tableName: metabase_table
- changeSet:
id: 10
author: cammsaul
validCheckSum: ANY
changes:
- createTable:
tableName: revision
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: model
type: varchar(16)
constraints:
nullable: false
- column:
name: model_id
type: int
constraints:
nullable: false
- column:
name: user_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_revision_ref_user_id
deferrable: false
initiallyDeferred: false
- column:
name: timestamp
type: DATETIME
constraints:
nullable: false
- column:
name: object
type: ${text.type}
constraints:
nullable: false
- column:
name: is_reversion
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: revision
indexName: idx_revision_model_model_id
columns:
- column:
name: model
- column:
name: model_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- modifySql:
dbms: mysql,mariadb
replace:
replace: object VARCHAR
with: object TEXT
- changeSet:
id: 11
author: agilliland
changes:
- sql:
sql: update report_dashboard set public_perms = 2 where public_perms = 1
- changeSet:
id: 12
author: agilliland
validCheckSum: ANY
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: database_id
type: int
constraints:
nullable: true
referencedTableName: metabase_database
referencedColumnNames: id
foreignKeyName: fk_report_card_ref_database_id
deferrable: false
initiallyDeferred: false
- addColumn:
tableName: report_card
columns:
- column:
name: table_id
type: int
constraints:
nullable: true
referencedTableName: metabase_table
referencedColumnNames: id
foreignKeyName: fk_report_card_ref_table_id
deferrable: false
initiallyDeferred: false
- addColumn:
tableName: report_card
columns:
- column:
name: query_type
type: varchar(16)
constraints:
nullable: true
- changeSet:
id: 13
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: activity
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: topic
type: varchar(32)
constraints:
nullable: false
- column:
name: timestamp
type: DATETIME
constraints:
nullable: false
- column:
name: user_id
type: int
constraints:
nullable: true
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_activity_ref_user_id
deferrable: false
initiallyDeferred: false
- column:
name: model
type: varchar(16)
constraints:
nullable: true
- column:
name: model_id
type: int
constraints:
nullable: true
- column:
name: database_id
type: int
constraints:
nullable: true
- column:
name: table_id
type: int
constraints:
nullable: true
- column:
name: custom_id
type: varchar(48)
constraints:
nullable: true
- column:
name: details
type: ${text.type}
constraints:
nullable: false
- createIndex:
tableName: activity
indexName: idx_activity_timestamp
columns:
column:
name: timestamp
- createIndex:
tableName: activity
indexName: idx_activity_user_id
columns:
column:
name: user_id
- createIndex:
tableName: activity
indexName: idx_activity_custom_id
columns:
column:
name: custom_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- modifySql:
dbms: mysql,mariadb
replace:
replace: details VARCHAR
with: details TEXT
- changeSet:
id: 14
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: view_log
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
constraints:
nullable: true
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_view_log_ref_user_id
deferrable: false
initiallyDeferred: false
- column:
name: model
type: varchar(16)
constraints:
nullable: false
- column:
name: model_id
type: int
constraints:
nullable: false
- column:
name: timestamp
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: view_log
indexName: idx_view_log_user_id
columns:
column:
name: user_id
- createIndex:
tableName: view_log
indexName: idx_view_log_timestamp
columns:
column:
name: model_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 15
author: agilliland
changes:
- addColumn:
tableName: revision
columns:
- column:
name: is_creation
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- changeSet:
id: 16
author: agilliland
changes:
- dropNotNullConstraint:
tableName: core_user
columnName: last_login
columnDataType: DATETIME
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 17
author: agilliland
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: is_sample
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- sql:
sql: update metabase_database set is_sample = true where name = 'Sample Dataset'
- changeSet:
id: 18
author: camsaul
validCheckSum: ANY
changes:
- createTable:
tableName: data_migrations
columns:
- column:
name: id
type: VARCHAR(254)
constraints:
primaryKey: true
nullable: false
- column:
name: timestamp
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: data_migrations
indexName: idx_data_migrations_id
columns:
column:
name: id
- changeSet:
id: 19
author: camsaul
changes:
- addColumn:
tableName: metabase_table
columns:
- column:
name: schema
type: VARCHAR(256)
- changeSet:
id: 20
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: pulse
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: creator_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_pulse_ref_creator_id
deferrable: false
initiallyDeferred: false
- column:
name: name
type: varchar(254)
constraints:
nullable: false
- column:
name: public_perms
type: int
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: pulse
indexName: idx_pulse_creator_id
columns:
column:
name: creator_id
- createTable:
tableName: pulse_card
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: pulse_id
type: int
constraints:
nullable: false
referencedTableName: pulse
referencedColumnNames: id
foreignKeyName: fk_pulse_card_ref_pulse_id
deferrable: false
initiallyDeferred: false
- column:
name: card_id
type: int
constraints:
nullable: false
referencedTableName: report_card
referencedColumnNames: id
foreignKeyName: fk_pulse_card_ref_card_id
deferrable: false
initiallyDeferred: false
- column:
name: position
type: int
constraints:
nullable: false
- createIndex:
tableName: pulse_card
indexName: idx_pulse_card_pulse_id
columns:
column:
name: pulse_id
- createIndex:
tableName: pulse_card
indexName: idx_pulse_card_card_id
columns:
column:
name: card_id
- createTable:
tableName: pulse_channel
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: pulse_id
type: int
constraints:
nullable: false
referencedTableName: pulse
referencedColumnNames: id
foreignKeyName: fk_pulse_channel_ref_pulse_id
deferrable: false
initiallyDeferred: false
- column:
name: channel_type
type: varchar(32)
constraints:
nullable: false
- column:
name: details
type: text
constraints:
nullable: false
- column:
name: schedule_type
type: varchar(32)
constraints:
nullable: false
- column:
name: schedule_hour
type: int
constraints:
nullable: true
- column:
name: schedule_day
type: varchar(64)
constraints:
nullable: true
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: pulse_channel
indexName: idx_pulse_channel_pulse_id
columns:
column:
name: pulse_id
- createIndex:
tableName: pulse_channel
indexName: idx_pulse_channel_schedule_type
columns:
column:
name: schedule_type
- createTable:
tableName: pulse_channel_recipient
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: pulse_channel_id
type: int
constraints:
nullable: false
referencedTableName: pulse_channel
referencedColumnNames: id
foreignKeyName: fk_pulse_channel_recipient_ref_pulse_channel_id
deferrable: false
initiallyDeferred: false
- column:
name: user_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_pulse_channel_recipient_ref_user_id
deferrable: false
initiallyDeferred: false
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 21
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: segment
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: table_id
type: int
constraints:
nullable: false
referencedTableName: metabase_table
referencedColumnNames: id
foreignKeyName: fk_segment_ref_table_id
deferrable: false
initiallyDeferred: false
- column:
name: creator_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_segment_ref_creator_id
deferrable: false
initiallyDeferred: false
- column:
name: name
type: varchar(254)
constraints:
nullable: false
- column:
name: description
type: text
constraints:
nullable: true
- column:
name: is_active
type: boolean
defaultValueBoolean: true
constraints:
nullable: false
- column:
name: definition
type: text
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: segment
indexName: idx_segment_creator_id
columns:
column:
name: creator_id
- createIndex:
tableName: segment
indexName: idx_segment_table_id
columns:
column:
name: table_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 22
author: agilliland
changes:
- addColumn:
tableName: revision
columns:
- column:
name: message
type: text
constraints:
nullable: true
- changeSet:
id: 23
author: agilliland
changes:
- modifyDataType:
tableName: metabase_table
columnName: rows
newDataType: BIGINT
- changeSet:
id: 24
author: agilliland
changes:
- createTable:
tableName: dependency
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: model
type: varchar(32)
constraints:
nullable: false
- column:
name: model_id
type: int
constraints:
nullable: false
- column:
name: dependent_on_model
type: varchar(32)
constraints:
nullable: false
- column:
name: dependent_on_id
type: int
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: dependency
indexName: idx_dependency_model
columns:
column:
name: model
- createIndex:
tableName: dependency
indexName: idx_dependency_model_id
columns:
column:
name: model_id
- createIndex:
tableName: dependency
indexName: idx_dependency_dependent_on_model
columns:
column:
name: dependent_on_model
- createIndex:
tableName: dependency
indexName: idx_dependency_dependent_on_id
columns:
column:
name: dependent_on_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 25
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: metric
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: table_id
type: int
constraints:
nullable: false
referencedTableName: metabase_table
referencedColumnNames: id
foreignKeyName: fk_metric_ref_table_id
deferrable: false
initiallyDeferred: false
- column:
name: creator_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_metric_ref_creator_id
deferrable: false
initiallyDeferred: false
- column:
name: name
type: varchar(254)
constraints:
nullable: false
- column:
name: description
type: text
constraints:
nullable: true
- column:
name: is_active
type: boolean
defaultValueBoolean: true
constraints:
nullable: false
- column:
name: definition
type: text
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: metric
indexName: idx_metric_creator_id
columns:
column:
name: creator_id
- createIndex:
tableName: metric
indexName: idx_metric_table_id
columns:
column:
name: table_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 26
author: agilliland
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: is_full_sync
type: boolean
defaultValueBoolean: true
constraints:
nullable: false
- sql:
sql: update metabase_database set is_full_sync = true
- changeSet:
id: 27
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: dashboardcard_series
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: dashboardcard_id
type: int
constraints:
nullable: false
referencedTableName: report_dashboardcard
referencedColumnNames: id
foreignKeyName: fk_dashboardcard_series_ref_dashboardcard_id
deferrable: false
initiallyDeferred: false
- column:
name: card_id
type: int
constraints:
nullable: false
referencedTableName: report_card
referencedColumnNames: id
foreignKeyName: fk_dashboardcard_series_ref_card_id
deferrable: false
initiallyDeferred: false
- column:
name: position
type: int
constraints:
nullable: false
- createIndex:
tableName: dashboardcard_series
indexName: idx_dashboardcard_series_dashboardcard_id
columns:
column:
name: dashboardcard_id
- createIndex:
tableName: dashboardcard_series
indexName: idx_dashboardcard_series_card_id
columns:
column:
name: card_id
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 28
author: agilliland
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: is_qbnewb
type: boolean
defaultValueBoolean: true
constraints:
nullable: false
- changeSet:
id: 29
author: agilliland
changes:
- addColumn:
tableName: pulse_channel
columns:
- column:
name: schedule_frame
type: varchar(32)
constraints:
nullable: true
- changeSet:
id: 30
author: agilliland
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: visibility_type
type: varchar(32)
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- addNotNullConstraint:
columnDataType: varchar(32)
columnName: visibility_type
defaultNullValue: unset
tableName: metabase_field
- changeSet:
id: 31
author: agilliland
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: fk_target_field_id
type: int
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- changeSet:
id: 32
author: camsaul
validCheckSum: ANY
changes:
######################################## label table ########################################
- createTable:
tableName: label
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: name
type: VARCHAR(254)
constraints:
nullable: false
- column:
name: slug
type: VARCHAR(254)
constraints:
nullable: false
unique: true
- column:
name: icon
type: VARCHAR(128)
- createIndex:
tableName: label
indexName: idx_label_slug
columns:
column:
name: slug
######################################## card_label table ########################################
- createTable:
tableName: card_label
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: card_id
type: int
constraints:
nullable: false
referencedTableName: report_card
referencedColumnNames: id
foreignKeyName: fk_card_label_ref_card_id
deferrable: false
initiallyDeferred: false
- column:
name: label_id
type: int
constraints:
nullable: false
referencedTableName: label
referencedColumnNames: id
foreignKeyName: fk_card_label_ref_label_id
deferrable: false
initiallyDeferred: false
- addUniqueConstraint:
tableName: card_label
columnNames: card_id, label_id
constraintName: unique_card_label_card_id_label_id
- createIndex:
tableName: card_label
indexName: idx_card_label_card_id
columns:
column:
name: card_id
- createIndex:
tableName: card_label
indexName: idx_card_label_label_id
columns:
column:
name: label_id
######################################## add archived column to report_card ########################################
- addColumn:
tableName: report_card
columns:
- column:
name: archived
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- changeSet:
id: 32
author: agilliland
validCheckSum: ANY
changes:
- createTable:
tableName: raw_table
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: database_id
type: int
constraints:
nullable: false
referencedTableName: metabase_database
referencedColumnNames: id
foreignKeyName: fk_rawtable_ref_database
deferrable: false
initiallyDeferred: false
- column:
name: active
type: boolean
constraints:
nullable: false
- column:
name: schema
type: varchar(255)
constraints:
nullable: true
- column:
name: name
type: varchar(255)
constraints:
nullable: false
- column:
name: details
type: text
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: raw_table
indexName: idx_rawtable_database_id
columns:
column:
name: database_id
- addUniqueConstraint:
tableName: raw_table
columnNames: database_id, schema, name
constraintName: uniq_raw_table_db_schema_name
- createTable:
tableName: raw_column
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: raw_table_id
type: int
constraints:
nullable: false
referencedTableName: raw_table
referencedColumnNames: id
foreignKeyName: fk_rawcolumn_tableid_ref_rawtable
deferrable: false
initiallyDeferred: false
- column:
name: active
type: boolean
constraints:
nullable: false
- column:
name: name
type: varchar(255)
constraints:
nullable: false
- column:
name: column_type
type: varchar(128)
constraints:
nullable: true
- column:
name: is_pk
type: boolean
constraints:
nullable: false
- column:
name: fk_target_column_id
type: int
constraints:
nullable: true
referencedTableName: raw_column
referencedColumnNames: id
foreignKeyName: fk_rawcolumn_fktarget_ref_rawcolumn
deferrable: false
initiallyDeferred: false
- column:
name: details
type: text
constraints:
nullable: false
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- createIndex:
tableName: raw_column
indexName: idx_rawcolumn_raw_table_id
columns:
column:
name: raw_table_id
- addUniqueConstraint:
tableName: raw_column
columnNames: raw_table_id, name
constraintName: uniq_raw_column_table_name
- addColumn:
tableName: metabase_table
columns:
- column:
name: raw_table_id
type: int
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- addColumn:
tableName: metabase_field
columns:
- column:
name: raw_column_id
type: int
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- addColumn:
tableName: metabase_field
columns:
- column:
name: last_analyzed
type: DATETIME
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- modifySql:
dbms: postgresql
replace:
replace: WITHOUT
with: WITH
- changeSet:
id: 34
author: tlrobinson
changes:
######################################## add enabled column to pulse_channel ########################################
- addColumn:
tableName: pulse_channel
columns:
- column:
name: enabled
type: boolean
defaultValueBoolean: true
constraints:
nullable: false
- changeSet:
id: 35
author: agilliland
changes:
- modifyDataType:
tableName: setting
columnName: value
newDataType: TEXT
- addNotNullConstraint:
tableName: setting
columnDataType: text
columnName: value
validCheckSum: 8:91b72167fca724e6b6a94b64f886cf09
- changeSet:
id: 36
author: agilliland
changes:
- addColumn:
tableName: report_dashboard
columns:
- column:
name: parameters
type: text
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- addNotNullConstraint:
columnDataType: text
columnName: parameters
defaultNullValue: '[]'
tableName: report_dashboard
- addColumn:
tableName: report_dashboardcard
columns:
- column:
name: parameter_mappings
type: text
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- addNotNullConstraint:
columnDataType: text
columnName: parameter_mappings
defaultNullValue: '[]'
tableName: report_dashboardcard
- changeSet:
id: 37
author: tlrobinson
changes:
- addColumn:
tableName: query_queryexecution
columns:
- column:
name: query_hash
type: int
constraints:
nullable: true
- addNotNullConstraint:
tableName: query_queryexecution
columnName: query_hash
columnDataType: int
defaultNullValue: 0
- createIndex:
tableName: query_queryexecution
indexName: idx_query_queryexecution_query_hash
columns:
column:
name: query_hash
- createIndex:
tableName: query_queryexecution
indexName: idx_query_queryexecution_started_at
columns:
column:
name: started_at
- changeSet:
id: 38
author: camsaul
validCheckSum: ANY
changes:
######################################## Add "points_of_interest" metadata column to various models ########################################
- addColumn:
tableName: metabase_database
columns:
- column:
name: points_of_interest
type: text
- addColumn:
tableName: metabase_table
columns:
- column:
name: points_of_interest
type: text
- addColumn:
tableName: metabase_field
columns:
- column:
name: points_of_interest
type: text
- addColumn:
tableName: report_dashboard
columns:
- column:
name: points_of_interest
type: text
- addColumn:
tableName: metric
columns:
- column:
name: points_of_interest
type: text
- addColumn:
tableName: segment
columns:
- column:
name: points_of_interest
type: text
######################################## Add "caveats" metadata column to various models ########################################
- addColumn:
tableName: metabase_database
columns:
- column:
name: caveats
type: text
- addColumn:
tableName: metabase_table
columns:
- column:
name: caveats
type: text
- addColumn:
tableName: metabase_field
columns:
- column:
name: caveats
type: text
- addColumn:
tableName: report_dashboard
columns:
- column:
name: caveats
type: text
- addColumn:
tableName: metric
columns:
- column:
name: caveats
type: text
- addColumn:
tableName: segment
columns:
- column:
name: caveats
type: text
######################################## Add "how_is_this_calculated" to metric ########################################
- addColumn:
tableName: metric
columns:
- column:
name: how_is_this_calculated
type: text
######################################## Add "most important dashboard" (0 or 1 dashboards) ########################################
- addColumn:
tableName: report_dashboard
columns:
- column:
name: show_in_getting_started
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: report_dashboard
indexName: idx_report_dashboard_show_in_getting_started
columns:
column:
name: show_in_getting_started
######################################## Add "most important metrics" (0+ metrics) ########################################
- addColumn:
tableName: metric
columns:
- column:
name: show_in_getting_started
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: metric
indexName: idx_metric_show_in_getting_started
columns:
column:
name: show_in_getting_started
######################################## Add "most important tables (0+ tables) ########################################
- addColumn:
tableName: metabase_table
columns:
- column:
name: show_in_getting_started
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: metabase_table
indexName: idx_metabase_table_show_in_getting_started
columns:
column:
name: show_in_getting_started
######################################## Add "most important segments" (0+ segments) ########################################
- addColumn:
tableName: segment
columns:
- column:
name: show_in_getting_started
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: segment
indexName: idx_segment_show_in_getting_started
columns:
column:
name: show_in_getting_started
######################################## Add "metric_important_field" table ########################################
- createTable:
tableName: metric_important_field
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: metric_id
type: int
constraints:
nullable: false
referencedTableName: metric
referencedColumnNames: id
foreignKeyName: fk_metric_important_field_metric_id
- column:
name: field_id
type: int
constraints:
nullable: false
referencedTableName: metabase_field
referencedColumnNames: id
foreignKeyName: fk_metric_important_field_metabase_field_id
- addUniqueConstraint:
tableName: metric_important_field
columnNames: metric_id, field_id
constraintName: unique_metric_important_field_metric_id_field_id
- createIndex:
tableName: metric_important_field
indexName: idx_metric_important_field_metric_id
columns:
column:
name: metric_id
- createIndex:
tableName: metric_important_field
indexName: idx_metric_important_field_field_id
columns:
column:
name: field_id
- changeSet:
id: 39
author: camsaul
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: google_auth
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- changeSet:
id: 40
author: camsaul
validCheckSum: ANY
changes:
############################################################ add PermissionsGroup table ############################################################
- createTable:
tableName: permissions_group
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
# TODO - it would be nice to make this a case-insensitive unique constraint / index?
- column:
name: name
type: varchar(255)
constraints:
nullable: false
unique: true
uniqueConstraintName: unique_permissions_group_name
- createIndex:
tableName: permissions_group
indexName: idx_permissions_group_name
columns:
column:
name: name
############################################################ add PermissionsGroupMembership table ############################################################
- createTable:
tableName: permissions_group_membership
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_permissions_group_membership_user_id
- column:
name: group_id
type: int
constraints:
nullable: false
referencedTableName: permissions_group
referencedColumnNames: id
foreignKeyName: fk_permissions_group_group_id
- addUniqueConstraint:
tableName: permissions_group_membership
columnNames: user_id, group_id
constraintName: unique_permissions_group_membership_user_id_group_id
# for things like all users in a given group
- createIndex:
tableName: permissions_group_membership
indexName: idx_permissions_group_membership_group_id
columns:
column:
name: group_id
# for things like all groups a user belongs to
- createIndex:
tableName: permissions_group_membership
indexName: idx_permissions_group_membership_user_id
columns:
column:
name: user_id
# for things like is given user a member of a given group (TODO - not sure we need this)
- createIndex:
tableName: permissions_group_membership
indexName: idx_permissions_group_membership_group_id_user_id
columns:
- column:
name: group_id
- column:
name: user_id
############################################################ add Permissions table ############################################################
- createTable:
tableName: permissions
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: object
type: varchar(254)
constraints:
nullable: false
- column:
name: group_id
type: int
constraints:
nullable: false
referencedTableName: permissions_group
referencedColumnNames: id
foreignKeyName: fk_permissions_group_id
- createIndex:
tableName: permissions
indexName: idx_permissions_group_id
columns:
column:
name: group_id
- createIndex:
tableName: permissions
indexName: idx_permissions_object
columns:
column:
name: object
- createIndex:
tableName: permissions
indexName: idx_permissions_group_id_object
columns:
- column:
name: group_id
- column:
name: object
- addUniqueConstraint:
tableName: permissions
columnNames: group_id, object
############################################################ Tweaks to metabase_table ############################################################
# Modify the length of metabase_table.schema from 256 -> 254
# It turns out MySQL InnoDB indices have to be 767 bytes or less (at least for older versions of MySQL)
# and 'utf8' text columns can use up to 3 bytes per character in MySQL -- see http://stackoverflow.com/a/22515986/1198455
# So 256 * 3 = 768 bytes (too large to index / add unique constraints)
# Drop this to 254; 254 * 3 = 762, which should give us room to index it along with a 4-byte integer as well if need be
# Hoping this doesn't break anyone's existing databases. Hopefully there aren't any schemas that are 255 or 256 bytes long out there; any longer
# and it would have already broke; any shorter and there's not problem.
# Anyway, better to break it now than to leave it as-is and have and break permissions where the columns have to be 254 characters wide
- modifyDataType:
tableName: metabase_table
columnName: schema
newDataType: varchar(254)
# Add index: this is for doing things like getting all the tables that belong to a given schema
- createIndex:
tableName: metabase_table
indexName: idx_metabase_table_db_id_schema
columns:
- column:
name: db_id
- column:
name: schema
- changeSet:
id: 41
author: camsaul
changes:
- dropColumn:
tableName: metabase_field
columnName: field_type
- addDefaultValue:
tableName: metabase_field
columnName: active
defaultValueBoolean: true
- addDefaultValue:
tableName: metabase_field
columnName: preview_display
defaultValueBoolean: true
- addDefaultValue:
tableName: metabase_field
columnName: position
defaultValueNumeric: 0
- addDefaultValue:
tableName: metabase_field
columnName: visibility_type
defaultValue: "normal"
- changeSet:
id: 42
author: camsaul
changes:
- dropForeignKeyConstraint:
baseTableName: query_queryexecution
constraintName: fk_queryexecution_ref_query_id
- dropColumn:
tableName: query_queryexecution
columnName: query_id
- dropColumn:
tableName: core_user
columnName: is_staff
- dropColumn:
tableName: metabase_database
columnName: organization_id
- dropColumn:
tableName: report_card
columnName: organization_id
- dropColumn:
tableName: report_dashboard
columnName: organization_id
- dropTable:
tableName: annotation_annotation
- dropTable:
tableName: core_permissionsviolation
- dropTable:
tableName: core_userorgperm
- dropTable:
tableName: core_organization
- dropTable:
tableName: metabase_foreignkey
- dropTable:
tableName: metabase_tablesegment
- dropTable:
tableName: query_query
- dropTable:
tableName: report_dashboardsubscription
- dropTable:
tableName: report_emailreport_recipients
- dropTable:
tableName: report_emailreportexecutions
- dropTable:
tableName: report_emailreport
- changeSet:
id: 43
author: camsaul
validCheckSum: ANY
changes:
- createTable:
tableName: permissions_revision
remarks: 'Used to keep track of changes made to permissions.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: before
type: text
remarks: 'Serialized JSON of the permissions before the changes.'
constraints:
nullable: false
- column:
name: after
type: text
remarks: 'Serialized JSON of the permissions after the changes.'
constraints:
nullable: false
- column:
name: user_id
type: int
remarks: 'The ID of the admin who made this set of changes.'
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_permissions_revision_user_id
- column:
name: created_at
type: datetime
remarks: 'The timestamp of when these changes were made.'
constraints:
nullable: false
- column:
name: remark
type: text
remarks: 'Optional remarks explaining why these changes were made.'
- changeSet:
id: 44
author: camsaul
changes:
- dropColumn:
tableName: report_card
columnName: public_perms
- dropColumn:
tableName: report_dashboard
columnName: public_perms
- dropColumn:
tableName: pulse
columnName: public_perms
- changeSet:
id: 45
author: tlrobinson
changes:
- addColumn:
tableName: report_dashboardcard
columns:
- column:
name: visualization_settings
type: text
- addNotNullConstraint:
tableName: report_dashboardcard
columnName: visualization_settings
columnDataType: text
defaultNullValue: '{}'
- changeSet:
id: 46
author: camsaul
changes:
- addNotNullConstraint:
tableName: report_dashboardcard
columnName: row
columnDataType: integer
defaultNullValue: 0
- addNotNullConstraint:
tableName: report_dashboardcard
columnName: col
columnDataType: integer
defaultNullValue: 0
- addDefaultValue:
tableName: report_dashboardcard
columnName: row
defaultValueNumeric: 0
- addDefaultValue:
tableName: report_dashboardcard
columnName: col
defaultValueNumeric: 0
- changeSet:
id: 47
author: camsaul
validCheckSum: ANY
changes:
######################################## collection table ########################################
- createTable:
tableName: collection
remarks: 'Collections are an optional way to organize Cards and handle permissions for them.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: name
type: text
remarks: 'The unique, user-facing name of this Collection.'
constraints:
nullable: false
- column:
name: slug
type: varchar(254)
remarks: 'URL-friendly, sluggified, indexed version of name.'
constraints:
nullable: false
unique: true
- column:
name: description
type: text
remarks: 'Optional description for this Collection.'
- column:
name: color
type: char(7)
remarks: 'Seven-character hex color for this Collection, including the preceding hash sign.'
constraints:
nullable: false
- column:
name: archived
type: boolean
remarks: 'Whether this Collection has been archived and should be hidden from users.'
defaultValueBoolean: false
constraints:
nullable: false
- createIndex:
tableName: collection
indexName: idx_collection_slug
columns:
column:
name: slug
######################################## add collection_id to report_card ########################################
- addColumn:
tableName: report_card
columns:
- column:
name: collection_id
type: int
remarks: 'Optional ID of Collection this Card belongs to.'
constraints:
referencedTableName: collection
referencedColumnNames: id
foreignKeyName: fk_card_collection_id
- createIndex:
tableName: report_card
indexName: idx_card_collection_id
columns:
column:
name: collection_id
- changeSet:
id: 48
author: camsaul
validCheckSum: ANY
changes:
- createTable:
tableName: collection_revision
remarks: 'Used to keep track of changes made to collections.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: before
type: text
remarks: 'Serialized JSON of the collections graph before the changes.'
constraints:
nullable: false
- column:
name: after
type: text
remarks: 'Serialized JSON of the collections graph after the changes.'
constraints:
nullable: false
- column:
name: user_id
type: int
remarks: 'The ID of the admin who made this set of changes.'
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_collection_revision_user_id
- column:
name: created_at
type: datetime
remarks: 'The timestamp of when these changes were made.'
constraints:
nullable: false
- column:
name: remark
type: text
remarks: 'Optional remarks explaining why these changes were made.'
- changeSet:
id: 49
author: camsaul
validCheckSum: ANY
changes:
######################################## Card public_uuid & indices ########################################
- addColumn:
tableName: report_card
columns:
- column:
name: public_uuid
type: char(36)
remarks: 'Unique UUID used to in publically-accessible links to this Card.'
constraints:
unique: true
- addColumn:
tableName: report_card
columns:
- column:
name: made_public_by_id
type: int
remarks: 'The ID of the User who first publically shared this Card.'
constraints:
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_card_made_public_by_id
- createIndex:
tableName: report_card
indexName: idx_card_public_uuid
columns:
column:
name: public_uuid
######################################## Dashboard public_uuid & indices ########################################
- addColumn:
tableName: report_dashboard
columns:
- column:
name: public_uuid
type: char(36)
remarks: 'Unique UUID used to in publically-accessible links to this Dashboard.'
constraints:
unique: true
- addColumn:
tableName: report_dashboard
columns:
- column:
name: made_public_by_id
type: int
remarks: 'The ID of the User who first publically shared this Dashboard.'
constraints:
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_dashboard_made_public_by_id
- createIndex:
tableName: report_dashboard
indexName: idx_dashboard_public_uuid
columns:
column:
name: public_uuid
######################################## make query_queryexecution.executor_id nullable ########################################
- dropNotNullConstraint:
tableName: query_queryexecution
columnName: executor_id
columnDataType: int
- changeSet:
id: 50
author: camsaul
validCheckSum: ANY
changes:
######################################## new Card columns ########################################
- addColumn:
tableName: report_card
columns:
- column:
name: enable_embedding
type: boolean
remarks: 'Is this Card allowed to be embedded in different websites (using a signed JWT)?'
defaultValueBoolean: false
constraints:
nullable: false
- addColumn:
tableName: report_card
columns:
- column:
name: embedding_params
type: text
remarks: 'Serialized JSON containing information about required parameters that must be supplied when embedding this Card.'
######################################## new Card columns ########################################
- addColumn:
tableName: report_dashboard
columns:
- column:
name: enable_embedding
type: boolean
remarks: 'Is this Dashboard allowed to be embedded in different websites (using a signed JWT)?'
defaultValueBoolean: false
constraints:
nullable: false
- addColumn:
tableName: report_dashboard
columns:
- column:
name: embedding_params
type: text
remarks: 'Serialized JSON containing information about required parameters that must be supplied when embedding this Dashboard.'
- changeSet:
id: 51
author: camsaul
validCheckSum: ANY
changes:
- createTable:
tableName: query_execution
remarks: 'A log of executed queries, used for calculating historic execution times, auditing, and other purposes.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: hash
type: binary(32)
remarks: 'The hash of the query dictionary. This is a 256-bit SHA3 hash of the query.'
constraints:
nullable: false
- column:
name: started_at
type: datetime
remarks: 'Timestamp of when this query started running.'
constraints:
nullable: false
- column:
name: running_time
type: integer
remarks: 'The time, in milliseconds, this query took to complete.'
constraints:
nullable: false
- column:
name: result_rows
type: integer
remarks: 'Number of rows in the query results.'
constraints:
nullable: false
- column:
name: native
type: boolean
remarks: 'Whether the query was a native query, as opposed to an MBQL one (e.g., created with the GUI).'
constraints:
nullable: false
- column:
name: context
type: varchar(32)
remarks: 'Short string specifying how this query was executed, e.g. in a Dashboard or Pulse.'
- column:
name: error
type: text
remarks: 'Error message returned by failed query, if any.'
# The following columns are foreign keys, but we don't keep FK constraints on them for a few reasons:
# - We don't want to keep indexes on these columns since they wouldn't be generally useful and for size and performance reasons
# - If a related object (e.g. a Dashboard) is deleted, we don't want to delete the related entries in the QueryExecution log.
# We could do something like make the constraint ON DELETE SET NULL, but that would require a full table scan to handle;
# If the QueryExecution log became tens of millions of rows large it would take a very long time to scan and update records
- column:
name: executor_id
type: integer
remarks: 'The ID of the User who triggered this query execution, if any.'
- column:
name: card_id
type: integer
remarks: 'The ID of the Card (Question) associated with this query execution, if any.'
- column:
name: dashboard_id
type: integer
remarks: 'The ID of the Dashboard associated with this query execution, if any.'
- column:
name: pulse_id
type: integer
remarks: 'The ID of the Pulse associated with this query execution, if any.'
# For things like auditing recently executed queries
- createIndex:
tableName: query_execution
indexName: idx_query_execution_started_at
columns:
column:
name: started_at
# For things like seeing the 10 most recent executions of a certain query
- createIndex:
tableName: query_execution
indexName: idx_query_execution_query_hash_started_at
columns:
- column:
name: hash
- column:
name: started_at
- changeSet:
id: 52
author: camsaul
changes:
- createTable:
tableName: query_cache
remarks: 'Cached results of queries are stored here when using the DB-based query cache.'
columns:
- column:
name: query_hash
type: binary(32)
remarks: 'The hash of the query dictionary. (This is a 256-bit SHA3 hash of the query dict).'
constraints:
primaryKey: true
nullable: false
- column:
name: updated_at
type: datetime
remarks: 'The timestamp of when these query results were last refreshed.'
constraints:
nullable: false
- column:
name: results
type: ${blob.type}
remarks: 'Cached, compressed results of running the query with the given hash.'
constraints:
nullable: false
- createIndex:
tableName: query_cache
indexName: idx_query_cache_updated_at
columns:
column:
name: updated_at
- addColumn:
tableName: report_card
columns:
- column:
name: cache_ttl
type: int
remarks: 'The maximum time, in seconds, to return cached results for this Card rather than running a new query.'
- changeSet:
id: 53
author: camsaul
changes:
- createTable:
tableName: query
remarks: 'Information (such as average execution time) for different queries that have been previously ran.'
columns:
- column:
name: query_hash
type: binary(32)
remarks: 'The hash of the query dictionary. (This is a 256-bit SHA3 hash of the query dict.)'
constraints:
primaryKey: true
nullable: false
- column:
name: average_execution_time
type: int
remarks: 'Average execution time for the query, round to nearest number of milliseconds. This is updated as a rolling average.'
constraints:
nullable: false
- changeSet:
id: 54
author: tlrobinson
validCheckSum: ANY
changes:
- addColumn:
tableName: pulse
columns:
- column:
name: skip_if_empty
type: boolean
remarks: 'Skip a scheduled Pulse if none of its questions have any results'
defaultValueBoolean: false
constraints:
nullable: false
- changeSet:
id: 55
author: camsaul
validCheckSum: ANY
changes:
- addColumn:
tableName: report_dashboard
columns:
- column:
name: archived
type: boolean
remarks: 'Is this Dashboard archived (effectively treated as deleted?)'
defaultValueBoolean: false
constraints:
nullable: false
- addColumn:
tableName: report_dashboard
columns:
- column:
name: position
type: integer
remarks: 'The position this Dashboard should appear in the Dashboards list, lower-numbered positions appearing before higher numbered ones.'
- createTable:
tableName: dashboard_favorite
remarks: 'Presence of a row here indicates a given User has favorited a given Dashboard.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
remarks: 'ID of the User who favorited the Dashboard.'
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_dashboard_favorite_user_id
deleteCascade: true
- column:
name: dashboard_id
type: int
remarks: 'ID of the Dashboard favorited by the User.'
constraints:
nullable: false
referencedTableName: report_dashboard
referencedColumnNames: id
foreignKeyName: fk_dashboard_favorite_dashboard_id
deleteCascade: true
- addUniqueConstraint:
tableName: dashboard_favorite
columnNames: user_id, dashboard_id
constraintName: unique_dashboard_favorite_user_id_dashboard_id
- createIndex:
tableName: dashboard_favorite
indexName: idx_dashboard_favorite_user_id
columns:
- column:
name: user_id
- createIndex:
tableName: dashboard_favorite
indexName: idx_dashboard_favorite_dashboard_id
columns:
- column:
name: dashboard_id
- changeSet:
id: 56
author: wwwiiilll
comment: 'Added 0.25.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: ldap_auth
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- changeSet:
id: 57
author: camsaul
comment: 'Added 0.25.0'
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: result_metadata
type: text
remarks: 'Serialized JSON containing metadata about the result columns from running the query.'
- changeSet:
id: 58
author: senior
validCheckSum: ANY
comment: 'Added 0.25.0'
changes:
- createTable:
tableName: dimension
remarks: 'Stores references to alternate views of existing fields, such as remapping an integer to a description, like an enum'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: field_id
type: int
remarks: 'ID of the field this dimension row applies to'
constraints:
deferrable: false
foreignKeyName: fk_dimension_ref_field_id
initiallyDeferred: false
nullable: false
referencedTableName: metabase_field
referencedColumnNames: id
deleteCascade: true
- column:
name: name
type: VARCHAR(254)
remarks: 'Short description used as the display name of this new column'
constraints:
nullable: false
- column:
name: type
type: varchar(254)
remarks: 'Either internal for a user defined remapping or external for a foreign key based remapping'
constraints:
nullable: false
- column:
name: human_readable_field_id
type: int
remarks: 'Only used with external type remappings. Indicates which field on the FK related table to use for display'
constraints:
deferrable: false
foreignKeyName: fk_dimension_displayfk_ref_field_id
initiallyDeferred: false
nullable: true
referencedTableName: metabase_field
referencedColumnNames: id
deleteCascade: true
- column:
name: created_at
type: DATETIME
remarks: 'The timestamp of when the dimension was created.'
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
remarks: 'The timestamp of when these dimension was last updated.'
constraints:
nullable: false
- addUniqueConstraint:
tableName: dimension
columnNames: field_id, name
constraintName: unique_dimension_field_id_name
- createIndex:
tableName: dimension
indexName: idx_dimension_field_id
columns:
- column:
name: field_id
- changeSet:
id: 59
author: camsaul
comment: 'Added 0.26.0'
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: fingerprint
type: text
remarks: 'Serialized JSON containing non-identifying information about this Field, such as min, max, and percent JSON. Used for classification.'
- changeSet:
id: 60
author: camsaul
validCheckSum: ANY
comment: 'Added 0.26.0'
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: metadata_sync_schedule
type: varchar(254)
remarks: 'The cron schedule string for when this database should undergo the metadata sync process (and analysis for new fields).'
defaultValue: '0 50 * * * ? *' # run at the end of every hour
constraints:
nullable: false
- addColumn:
tableName: metabase_database
columns:
- column:
name: cache_field_values_schedule
type: varchar(254)
remarks: 'The cron schedule string for when FieldValues for eligible Fields should be updated.'
defaultValue: '0 50 0 * * ? *' # run at 12:50 AM
constraints:
nullable: false
- changeSet:
id: 61
author: camsaul
comment: 'Added 0.26.0'
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: fingerprint_version
type: int
remarks: 'The version of the fingerprint for this Field. Used so we can keep track of which Fields need to be analyzed again when new things are added to fingerprints.'
defaultValue: 0
constraints:
nullable: false
- changeSet:
id: 62
author: senior
comment: 'Added 0.26.0'
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: timezone
type: VARCHAR(254)
remarks: 'Timezone identifier for the database, set by the sync process'
- changeSet:
id: 63
author: camsaul
comment: 'Added 0.26.0'
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: is_on_demand
type: boolean
remarks: 'Whether we should do On-Demand caching of FieldValues for this DB. This means FieldValues are updated when their Field is used in a Dashboard or Card param.'
defaultValue: false
constraints:
nullable: false
- changeSet:
id: 64
author: senior
comment: 'Added 0.26.0'
changes:
- dropForeignKeyConstraint:
baseTableName: raw_table
constraintName: fk_rawtable_ref_database
remarks: 'This FK prevents deleting databases even though RAW_TABLE is no longer used. The table is still around to support downgrades, but the FK reference is no longer needed.'
# Changeset 65 was accidentally released in 0.26.0.RC2. The changeset has been removed from the migrations list so that
# users that haven't ran the migration (i.e. they didn't run 0.26.0.RC2) won't waste time running it just to have it
# reversed. For 0.26.0.RC2 users, the below changeset will remove those tables if they are present
- changeSet:
id: 66
author: senior
comment: 'Added 0.26.0'
validCheckSum: ANY
changes:
- sql:
sql: drop table if exists computation_job_result cascade
- sql:
sql: drop table if exists computation_job cascade
# NOTE Atte Keinänen 9/28/17: This was originally in changeset 65 as explained above
- changeSet:
id: 67
author: attekei
validCheckSum: ANY
comment: 'Added 0.27.0'
changes:
- createTable:
tableName: computation_job
remarks: 'Stores submitted async computation jobs.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
constraints:
deferrable: false
foreignKeyName: fk_computation_job_ref_user_id
initiallyDeferred: false
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
type: int
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- column:
name: type
type: varchar(254)
constraints:
nullable: false
- column:
name: status
type: varchar(254)
constraints:
nullable: false
- createTable:
tableName: computation_job_result
remarks: 'Stores results of async computation jobs.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
constraints:
deferrable: false
foreignKeyName: fk_computation_result_ref_job_id
initiallyDeferred: false
nullable: false
referencedTableName: computation_job
referencedColumnNames: id
name: job_id
type: int
- column:
name: created_at
type: DATETIME
constraints:
nullable: false
- column:
name: updated_at
type: DATETIME
constraints:
nullable: false
- column:
name: permanence
type: varchar(254)
constraints:
nullable: false
- column:
name: payload
type: text
constraints:
nullable: false
- changeSet:
id: 68
author: sbelak
comment: 'Added 0.27.0'
validCheckSum: ANY
changes:
- addColumn:
tableName: computation_job
columns:
- column:
name: context
type: text
- addColumn:
tableName: computation_job
columns:
- column:
name: ended_at
type: DATETIME
- changeSet:
id: 69
author: senior
validCheckSum: ANY
comment: 'Added 0.27.0'
remarks: 'Add columns to the pulse table for alerts'
changes:
- addColumn:
tableName: pulse
columns:
- column:
name: alert_condition
type: varchar(254)
remarks: 'Condition (i.e. "rows" or "goal") used as a guard for alerts'
- addColumn:
tableName: pulse
columns:
- column:
name: alert_first_only
type: boolean
remarks: 'True if the alert should be disabled after the first notification'
- addColumn:
tableName: pulse
columns:
- column:
name: alert_above_goal
type: boolean
remarks: 'For a goal condition, alert when above the goal'
# There is no name for an alert, so this column is only required for pulses
- dropNotNullConstraint:
tableName: pulse
columnName: name
columnDataType: varchar(254)
- changeSet:
id: 70
author: camsaul
comment: 'Added 0.28.0'
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: database_type
type: varchar(255)
remarks: 'The actual type of this column in the database. e.g. VARCHAR or TEXT.'
# We want to enforce NOT NULL right away for all columns going forward so just put some sort of
# placeholder in place for existing columns.
- addNotNullConstraint:
tableName: metabase_field
columnName: database_type
columnDataType: varchar(255)
defaultNullValue: '?'
- changeSet:
id: 71
author: camsaul
comment: 'Added 0.28.0'
changes:
# drop the NOT NULL constraint on DashboardCard.card_id since we're now letting you add things other than Cards
# to Dashboards, for example static text cards
- dropNotNullConstraint:
tableName: report_dashboardcard
columnName: card_id
columnDataType: int
- changeSet:
id: 72
author: senior
validCheckSum: ANY
comment: 'Added 0.28.0'
changes:
- addColumn:
tableName: pulse_card
columns:
- column:
name: include_csv
type: boolean
defaultValueBoolean: false
remarks: 'True if a CSV of the data should be included for this pulse card'
constraints:
nullable: false
- addColumn:
tableName: pulse_card
columns:
- column:
name: include_xls
type: boolean
defaultValueBoolean: false
remarks: 'True if a XLS of the data should be included for this pulse card'
constraints:
nullable: false
- changeSet:
id: 73
author: camsaul
comment: 'Added 0.29.0'
changes:
# add a new 'options' (serialized JSON) column to Database to store things like whether we should default to
# making string searches case-insensitive
- addColumn:
tableName: metabase_database
columns:
- column:
name: options
type: text
remarks: 'Serialized JSON containing various options like QB behavior.'
- changeSet:
id: 74
author: camsaul
comment: 'Added 0.29.0'
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: has_field_values
type: text
remarks: 'Whether we have FieldValues ("list"), should ad-hoc search ("search"), disable entirely ("none"), or infer dynamically (null)"'
- changeSet:
id: 75
author: camsaul
comment: 'Added 0.28.2'
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: read_permissions
type: text
remarks: 'Permissions required to view this Card and run its query.'
- changeSet:
id: 76
author: senior
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: metabase_table
columns:
- column:
name: fields_hash
type: text
remarks: 'Computed hash of all of the fields associated to this table'
- changeSet:
id: 77
author: senior
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: login_attributes
type: text
remarks: 'JSON serialized map with attributes used for row level permissions'
- changeSet:
id: 78
author: camsaul
validCheckSum: ANY
comment: 'Added 0.30.0'
changes:
- createTable:
tableName: group_table_access_policy
remarks: 'Records that a given Card (Question) should automatically replace a given Table as query source for a given a Perms Group.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: group_id
type: int
remarks: 'ID of the Permissions Group this policy affects.'
constraints:
nullable: false
referencedTableName: permissions_group
referencedColumnNames: id
foreignKeyName: fk_gtap_group_id
deleteCascade: true
- column:
name: table_id
type: int
remarks: 'ID of the Table that should get automatically replaced as query source for the Permissions Group.'
constraints:
nullable: false
referencedTableName: metabase_table
referencedColumnNames: id
foreignKeyName: fk_gtap_table_id
deleteCascade: true
- column:
name: card_id
type: int
remarks: 'ID of the Card (Question) to be used to replace the Table.'
constraints:
nullable: false
referencedTableName: report_card
referencedColumnNames: id
foreignKeyName: fk_gtap_card_id
- column:
name: attribute_remappings
type: text
remarks: 'JSON-encoded map of user attribute identifier to the param name used in the Card.'
# TODO - do we also want to include `created_at` and `updated_at` columns here? We can add them later if needed
# Add an index on table_id + group_id since that is what the Query Processor is going to be looking up 99% of
# the time in order to get the corresponding Card ID for query-rewriting purposes
#
# TODO - do we want indexes on any of the other FKs? Are we going to be looking up all the GTAPs for a given
# Table or for a given Group with enough regularity we would want to put indexes on those columns?
- createIndex:
indexName: idx_gtap_table_id_group_id
tableName: group_table_access_policy
columns:
- column:
name: table_id
- column:
name: group_id
# There should only ever be one GTAP entry for a give Group + Table combination.
- addUniqueConstraint:
tableName: group_table_access_policy
columnNames: table_id, group_id
constraintName: unique_gtap_table_id_group_id
- changeSet:
id: 79
author: camsaul
validCheckSum: ANY
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: report_dashboard
columns:
- column:
name: collection_id
type: int
remarks: 'Optional ID of Collection this Dashboard belongs to.'
constraints:
referencedTableName: collection
referencedColumnNames: id
foreignKeyName: fk_dashboard_collection_id
# TODO - if someone deletes a collection, what should happen to the Dashboards that are in it? Should they
# get deleted as well? Or should collection_id be cleared, effectively putting them in the so-called
# "root" collection?
- createIndex:
tableName: report_dashboard
indexName: idx_dashboard_collection_id
columns:
- column:
name: collection_id
- addColumn:
tableName: pulse
columns:
- column:
name: collection_id
type: int
remarks: 'Options ID of Collection this Pulse belongs to.'
constraints:
referencedTableName: collection
referencedColumnNames: id
foreignKeyName: fk_pulse_collection_id
- createIndex:
tableName: pulse
indexName: idx_pulse_collection_id
columns:
- column:
name: collection_id
- changeSet:
id: 80
author: camsaul
changes:
- addColumn:
tableName: collection
columns:
- column:
name: location
type: varchar(254)
remarks: 'Directory-structure path of ancestor Collections. e.g. "/1/2/" means our Parent is Collection 2, and their parent is Collection 1.'
constraints:
nullable: false
defaultValue: "/"
- createIndex:
tableName: collection
indexName: idx_collection_location
columns:
- column:
name: location
- changeSet:
id: 81
author: camsaul
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: report_dashboard
columns:
- column:
name: collection_position
type: smallint
remarks: 'Optional pinned position for this item in its Collection. NULL means item is not pinned.'
- addColumn:
tableName: report_card
columns:
- column:
name: collection_position
type: smallint
remarks: 'Optional pinned position for this item in its Collection. NULL means item is not pinned.'
- addColumn:
tableName: pulse
columns:
- column:
name: collection_position
type: smallint
remarks: 'Optional pinned position for this item in its Collection. NULL means item is not pinned.'
- changeSet:
id: 82
author: senior
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: updated_at
type: datetime
remarks: 'When was this User last updated?'
- sql:
sql: update core_user set updated_at=date_joined
# Remove the GTAP card_id constraint. When not included, will default to querying against the GTAP table_id.
- changeSet:
id: 83
author: senior
comment: 'Added 0.30.0'
changes:
- dropNotNullConstraint:
tableName: group_table_access_policy
columnName: card_id
columnDataType: int
# Switch the logic for metric/segment archiving to be more consistent with other entities in the model.
# Similarly, add the archived flag to pulses which doesn't have one.
- changeSet:
id: 84
author: senior
comment: 'Added 0.30.0'
changes:
- renameColumn:
tableName: metric
columnDataType: boolean
newColumnName: archived
oldColumnName: is_active
- addDefaultValue:
tableName: metric
columnDataType: boolean
columnName: archived
defaultValueBoolean: false
- renameColumn:
tableName: segment
columnDataType: boolean
newColumnName: archived
oldColumnName: is_active
- addDefaultValue:
tableName: segment
columnDataType: boolean
columnName: archived
defaultValueBoolean: false
- addColumn:
tableName: pulse
columns:
- column:
name: archived
type: boolean
remarks: 'Has this pulse been archived?'
defaultValueBoolean: false
# Before this change, metrics/segments had opposite logic, rather than marking something as archived
# it was marked as active. Since the column is now an archived column, flip the boolean value
#
# As you may have noticed, we're not flipping the value for Metric here. @senior originally intended to do so,
# but the YAML was off slightly. We have corrected this issue at a later date -- see migration #100
- sql:
sql: update segment set archived = not(archived)
# Personal Collections, and removing Collection's unique constraint and index on slug
- changeSet:
id: 85
author: camsaul
validCheckSum: ANY
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: collection
columns:
- column:
name: personal_owner_id
type: int
remarks: 'If set, this Collection is a personal Collection, for exclusive use of the User with this ID.'
constraints:
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_collection_personal_owner_id
unique: true
uniqueConstraintName: unique_collection_personal_owner_id
deleteCascade: true
# Needed so we can efficiently look up the Collection belonging to a User, and so we can efficiently enforce the
# unique constraint
- createIndex:
tableName: collection
indexName: idx_collection_personal_owner_id
columns:
- column:
name: personal_owner_id
# We're no longer enforcing unique constraints on Collection slugs or using them directly in the URLs, so let's
# go ahead and remove stuff related to that...
#
# It's easier to just copy the value of slug to a new column and drop the old one than to try to deduce what the
# unique constraint is named locally across all of our different DBMSes
# (For example see https://stackoverflow.com/questions/10008476/dropping-unique-constraint-for-column-in-h2)
#
# Here's the plan: add new column _slug; copy values of slug into _slug; remove slug; rename _slug to slug
- addColumn:
tableName: collection
columns:
- column:
name: _slug
type: varchar(254)
remarks: 'Sluggified version of the Collection name. Used only for display purposes in URL; not unique or indexed.'
# I don't know of an easy way to copy existing values of slug to _slug with Liquibase as we create the column so
# just have to do it this way instead
- sql:
sql: UPDATE collection SET _slug = slug
- addNotNullConstraint:
tableName: collection
columnName: _slug
columnDataType: varchar(254)
- dropColumn:
tableName: collection
columnName: slug
- renameColumn:
tableName: collection
oldColumnName: _slug
newColumnName: slug
columnDataType: varchar(254)
# Let's try to make sure the comments on the name column of Collection actually reflect reality
- sql:
dbms: postgresql,h2
sql: "COMMENT ON COLUMN collection.name IS 'The user-facing name of this Collection.'"
- sql:
dbms: mysql,mariadb
sql: "ALTER TABLE `collection` CHANGE `name` `name` TEXT NOT NULL COMMENT 'The user-facing name of this Collection.'"
# In 0.30.0 we finally removed the long-deprecated native read permissions. Since they're no longer considered valid by
# our permissions code, remove any entries for them so they don't cause problems.
- changeSet:
id: 86
author: camsaul
comment: 'Added 0.30.0'
changes:
- sql:
sql: DELETE FROM permissions WHERE object LIKE '%/native/read/'
# Time to finally get rid of the RawTable and RawColumn tables. Bye Felicia!
- changeSet:
id: 87
author: camsaul
comment: 'Added 0.30.0'
changes:
- dropTable:
tableName: raw_column
- dropTable:
tableName: raw_table
- changeSet:
id: 88
author: senior
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: saml_auth
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
remarks: 'Boolean to indicate if this user is authenticated via SAML'
# The Quartz Task Scheduler can use a DB to 'cluster' tasks and make sure they are only ran by a single instance where
# using a multi-instance Metabase setup.
# Quartz identifiers are upper-case in MySQL and H2 but lower-case in PostgreSQL for reasons... so we'll have to
# define properties for EVERYTHING and use the correct identifiers
- property: {name: quartz.blob_data.name, dbms: "postgresql", value: blob_data}
- property: {name: quartz.blob_data.name, dbms: "mysql,mariadb,h2", value: BLOB_DATA}
- property: {name: quartz.bool_prop_1.name, dbms: "postgresql", value: bool_prop_1}
- property: {name: quartz.bool_prop_1.name, dbms: "mysql,mariadb,h2", value: BOOL_PROP_1}
- property: {name: quartz.bool_prop_2.name, dbms: "postgresql", value: bool_prop_2}
- property: {name: quartz.bool_prop_2.name, dbms: "mysql,mariadb,h2", value: BOOL_PROP_2}
- property: {name: quartz.calendar.name, dbms: "postgresql", value: calendar}
- property: {name: quartz.calendar.name, dbms: "mysql,mariadb,h2", value: CALENDAR}
- property: {name: quartz.calendar_name.name, dbms: "postgresql", value: calendar_name}
- property: {name: quartz.calendar_name.name, dbms: "mysql,mariadb,h2", value: CALENDAR_NAME}
- property: {name: quartz.checkin_interval.name, dbms: "postgresql", value: checkin_interval}
- property: {name: quartz.checkin_interval.name, dbms: "mysql,mariadb,h2", value: CHECKIN_INTERVAL}
- property: {name: quartz.cron_expression.name, dbms: "postgresql", value: cron_expression}
- property: {name: quartz.cron_expression.name, dbms: "mysql,mariadb,h2", value: CRON_EXPRESSION}
- property: {name: quartz.dec_prop_1.name, dbms: "postgresql", value: dec_prop_1}
- property: {name: quartz.dec_prop_1.name, dbms: "mysql,mariadb,h2", value: DEC_PROP_1}
- property: {name: quartz.dec_prop_2.name, dbms: "postgresql", value: dec_prop_2}
- property: {name: quartz.dec_prop_2.name, dbms: "mysql,mariadb,h2", value: DEC_PROP_2}
- property: {name: quartz.description.name, dbms: "postgresql", value: description}
- property: {name: quartz.description.name, dbms: "mysql,mariadb,h2", value: DESCRIPTION}
- property: {name: quartz.end_time.name, dbms: "postgresql", value: end_time}
- property: {name: quartz.end_time.name, dbms: "mysql,mariadb,h2", value: END_TIME}
- property: {name: quartz.entry_id.name, dbms: "postgresql", value: entry_id}
- property: {name: quartz.entry_id.name, dbms: "mysql,mariadb,h2", value: ENTRY_ID}
- property: {name: quartz.fired_time.name, dbms: "postgresql", value: fired_time}
- property: {name: quartz.fired_time.name, dbms: "mysql,mariadb,h2", value: FIRED_TIME}
- property: {name: quartz.fk_qrtz_blob_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_blob_triggers_triggers}
- property: {name: quartz.fk_qrtz_blob_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_BLOB_TRIGGERS_TRIGGERS}
- property: {name: quartz.fk_qrtz_cron_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_cron_triggers_triggers}
- property: {name: quartz.fk_qrtz_cron_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_CRON_TRIGGERS_TRIGGERS}
- property: {name: quartz.fk_qrtz_simple_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_simple_triggers_triggers}
- property: {name: quartz.fk_qrtz_simple_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_SIMPLE_TRIGGERS_TRIGGERS}
- property: {name: quartz.fk_qrtz_simprop_triggers_triggers.name, dbms: "postgresql", value: fk_qrtz_simprop_triggers_triggers}
- property: {name: quartz.fk_qrtz_simprop_triggers_triggers.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_SIMPROP_TRIGGERS_TRIGGERS}
- property: {name: quartz.fk_qrtz_triggers_job_details.name, dbms: "postgresql", value: fk_qrtz_triggers_job_details}
- property: {name: quartz.fk_qrtz_triggers_job_details.name, dbms: "mysql,mariadb,h2", value: FK_QRTZ_TRIGGERS_JOB_DETAILS}
- property: {name: quartz.idx_qrtz_ft_inst_job_req_rcvry.name, dbms: "postgresql", value: idx_qrtz_ft_inst_job_req_rcvry}
- property: {name: quartz.idx_qrtz_ft_inst_job_req_rcvry.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_INST_JOB_REQ_RCVRY}
- property: {name: quartz.idx_qrtz_ft_jg.name, dbms: "postgresql", value: idx_qrtz_ft_jg}
- property: {name: quartz.idx_qrtz_ft_jg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_JG}
- property: {name: quartz.idx_qrtz_ft_j_g.name, dbms: "postgresql", value: idx_qrtz_ft_j_g}
- property: {name: quartz.idx_qrtz_ft_j_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_J_G}
- property: {name: quartz.idx_qrtz_ft_tg.name, dbms: "postgresql", value: idx_qrtz_ft_tg}
- property: {name: quartz.idx_qrtz_ft_tg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_TG}
- property: {name: quartz.idx_qrtz_ft_trig_inst_name.name, dbms: "postgresql", value: idx_qrtz_ft_trig_inst_name}
- property: {name: quartz.idx_qrtz_ft_trig_inst_name.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_TRIG_INST_NAME}
- property: {name: quartz.idx_qrtz_ft_t_g.name, dbms: "postgresql", value: idx_qrtz_ft_t_g}
- property: {name: quartz.idx_qrtz_ft_t_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_FT_T_G}
- property: {name: quartz.idx_qrtz_j_grp.name, dbms: "postgresql", value: idx_qrtz_j_grp}
- property: {name: quartz.idx_qrtz_j_grp.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_J_GRP}
- property: {name: quartz.idx_qrtz_j_req_recovery.name, dbms: "postgresql", value: idx_qrtz_j_req_recovery}
- property: {name: quartz.idx_qrtz_j_req_recovery.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_J_REQ_RECOVERY}
- property: {name: quartz.idx_qrtz_t_c.name, dbms: "postgresql", value: idx_qrtz_t_c}
- property: {name: quartz.idx_qrtz_t_c.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_C}
- property: {name: quartz.idx_qrtz_t_g.name, dbms: "postgresql", value: idx_qrtz_t_g}
- property: {name: quartz.idx_qrtz_t_g.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_G}
- property: {name: quartz.idx_qrtz_t_j.name, dbms: "postgresql", value: idx_qrtz_t_j}
- property: {name: quartz.idx_qrtz_t_j.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_J}
- property: {name: quartz.idx_qrtz_t_jg.name, dbms: "postgresql", value: idx_qrtz_t_jg}
- property: {name: quartz.idx_qrtz_t_jg.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_JG}
- property: {name: quartz.idx_qrtz_t_next_fire_time.name, dbms: "postgresql", value: idx_qrtz_t_next_fire_time}
- property: {name: quartz.idx_qrtz_t_next_fire_time.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NEXT_FIRE_TIME}
- property: {name: quartz.idx_qrtz_t_nft_misfire.name, dbms: "postgresql", value: idx_qrtz_t_nft_misfire}
- property: {name: quartz.idx_qrtz_t_nft_misfire.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_MISFIRE}
- property: {name: quartz.idx_qrtz_t_nft_st.name, dbms: "postgresql", value: idx_qrtz_t_nft_st}
- property: {name: quartz.idx_qrtz_t_nft_st.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST}
- property: {name: quartz.idx_qrtz_t_nft_st_misfire.name, dbms: "postgresql", value: idx_qrtz_t_nft_st_misfire}
- property: {name: quartz.idx_qrtz_t_nft_st_misfire.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST_MISFIRE}
- property: {name: quartz.idx_qrtz_t_nft_st_misfire_grp.name, dbms: "postgresql", value: idx_qrtz_t_nft_st_misfire_grp}
- property: {name: quartz.idx_qrtz_t_nft_st_misfire_grp.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_NFT_ST_MISFIRE_GRP}
- property: {name: quartz.idx_qrtz_t_n_g_state.name, dbms: "postgresql", value: idx_qrtz_t_n_g_state}
- property: {name: quartz.idx_qrtz_t_n_g_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_N_G_STATE}
- property: {name: quartz.idx_qrtz_t_n_state.name, dbms: "postgresql", value: idx_qrtz_t_n_state}
- property: {name: quartz.idx_qrtz_t_n_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_N_STATE}
- property: {name: quartz.idx_qrtz_t_state.name, dbms: "postgresql", value: idx_qrtz_t_state}
- property: {name: quartz.idx_qrtz_t_state.name, dbms: "mysql,mariadb,h2", value: IDX_QRTZ_T_STATE}
- property: {name: quartz.instance_name.name, dbms: "postgresql", value: instance_name}
- property: {name: quartz.instance_name.name, dbms: "mysql,mariadb,h2", value: INSTANCE_NAME}
- property: {name: quartz.int_prop_1.name, dbms: "postgresql", value: int_prop_1}
- property: {name: quartz.int_prop_1.name, dbms: "mysql,mariadb,h2", value: INT_PROP_1}
- property: {name: quartz.int_prop_2.name, dbms: "postgresql", value: int_prop_2}
- property: {name: quartz.int_prop_2.name, dbms: "mysql,mariadb,h2", value: INT_PROP_2}
- property: {name: quartz.is_durable.name, dbms: "postgresql", value: is_durable}
- property: {name: quartz.is_durable.name, dbms: "mysql,mariadb,h2", value: IS_DURABLE}
- property: {name: quartz.is_nonconcurrent.name, dbms: "postgresql", value: is_nonconcurrent}
- property: {name: quartz.is_nonconcurrent.name, dbms: "mysql,mariadb,h2", value: IS_NONCONCURRENT}
- property: {name: quartz.is_update_data.name, dbms: "postgresql", value: is_update_data}
- property: {name: quartz.is_update_data.name, dbms: "mysql,mariadb,h2", value: IS_UPDATE_DATA}
- property: {name: quartz.job_class_name.name, dbms: "postgresql", value: job_class_name}
- property: {name: quartz.job_class_name.name, dbms: "mysql,mariadb,h2", value: JOB_CLASS_NAME}
- property: {name: quartz.job_data.name, dbms: "postgresql", value: job_data}
- property: {name: quartz.job_data.name, dbms: "mysql,mariadb,h2", value: JOB_DATA}
- property: {name: quartz.job_group.name, dbms: "postgresql", value: job_group}
- property: {name: quartz.job_group.name, dbms: "mysql,mariadb,h2", value: JOB_GROUP}
- property: {name: quartz.job_name.name, dbms: "postgresql", value: job_name}
- property: {name: quartz.job_name.name, dbms: "mysql,mariadb,h2", value: JOB_NAME}
- property: {name: quartz.last_checkin_time.name, dbms: "postgresql", value: last_checkin_time}
- property: {name: quartz.last_checkin_time.name, dbms: "mysql,mariadb,h2", value: LAST_CHECKIN_TIME}
- property: {name: quartz.lock_name.name, dbms: "postgresql", value: lock_name}
- property: {name: quartz.lock_name.name, dbms: "mysql,mariadb,h2", value: LOCK_NAME}
- property: {name: quartz.long_prop_1.name, dbms: "postgresql", value: long_prop_1}
- property: {name: quartz.long_prop_1.name, dbms: "mysql,mariadb,h2", value: LONG_PROP_1}
- property: {name: quartz.long_prop_2.name, dbms: "postgresql", value: long_prop_2}
- property: {name: quartz.long_prop_2.name, dbms: "mysql,mariadb,h2", value: LONG_PROP_2}
- property: {name: quartz.misfire_instr.name, dbms: "postgresql", value: misfire_instr}
- property: {name: quartz.misfire_instr.name, dbms: "mysql,mariadb,h2", value: MISFIRE_INSTR}
- property: {name: quartz.next_fire_time.name, dbms: "postgresql", value: next_fire_time}
- property: {name: quartz.next_fire_time.name, dbms: "mysql,mariadb,h2", value: NEXT_FIRE_TIME}
- property: {name: quartz.pk_qrtz_blob_triggers.name, dbms: "postgresql", value: pk_qrtz_blob_triggers}
- property: {name: quartz.pk_qrtz_blob_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_BLOB_TRIGGERS}
- property: {name: quartz.pk_qrtz_calendars.name, dbms: "postgresql", value: pk_qrtz_calendars}
- property: {name: quartz.pk_qrtz_calendars.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_CALENDARS}
- property: {name: quartz.pk_qrtz_cron_triggers.name, dbms: "postgresql", value: pk_qrtz_cron_triggers}
- property: {name: quartz.pk_qrtz_cron_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_CRON_TRIGGERS}
- property: {name: quartz.pk_qrtz_fired_triggers.name, dbms: "postgresql", value: pk_qrtz_fired_triggers}
- property: {name: quartz.pk_qrtz_fired_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_FIRED_TRIGGERS}
- property: {name: quartz.pk_qrtz_job_details.name, dbms: "postgresql", value: pk_qrtz_job_details}
- property: {name: quartz.pk_qrtz_job_details.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_JOB_DETAILS}
- property: {name: quartz.pk_qrtz_locks.name, dbms: "postgresql", value: pk_qrtz_locks}
- property: {name: quartz.pk_qrtz_locks.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_LOCKS}
- property: {name: quartz.pk_qrtz_scheduler_state.name, dbms: "postgresql", value: pk_qrtz_scheduler_state}
- property: {name: quartz.pk_qrtz_scheduler_state.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SCHEDULER_STATE}
- property: {name: quartz.pk_qrtz_simple_triggers.name, dbms: "postgresql", value: pk_qrtz_simple_triggers}
- property: {name: quartz.pk_qrtz_simple_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SIMPLE_TRIGGERS}
- property: {name: quartz.pk_qrtz_simprop_triggers.name, dbms: "postgresql", value: pk_qrtz_simprop_triggers}
- property: {name: quartz.pk_qrtz_simprop_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_SIMPROP_TRIGGERS}
- property: {name: quartz.pk_qrtz_triggers.name, dbms: "postgresql", value: pk_qrtz_triggers}
- property: {name: quartz.pk_qrtz_triggers.name, dbms: "mysql,mariadb,h2", value: PK_QRTZ_TRIGGERS}
- property: {name: quartz.pk_sched_name.name, dbms: "postgresql", value: pk_sched_name}
- property: {name: quartz.pk_sched_name.name, dbms: "mysql,mariadb,h2", value: PK_SCHED_NAME}
- property: {name: quartz.prev_fire_time.name, dbms: "postgresql", value: prev_fire_time}
- property: {name: quartz.prev_fire_time.name, dbms: "mysql,mariadb,h2", value: PREV_FIRE_TIME}
- property: {name: quartz.priority.name, dbms: "postgresql", value: priority}
- property: {name: quartz.priority.name, dbms: "mysql,mariadb,h2", value: PRIORITY}
- property: {name: quartz.qrtz_blob_triggers.name, dbms: "postgresql", value: qrtz_blob_triggers}
- property: {name: quartz.qrtz_blob_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_BLOB_TRIGGERS}
- property: {name: quartz.qrtz_calendars.name, dbms: "postgresql", value: qrtz_calendars}
- property: {name: quartz.qrtz_calendars.name, dbms: "mysql,mariadb,h2", value: QRTZ_CALENDARS}
- property: {name: quartz.qrtz_cron_triggers.name, dbms: "postgresql", value: qrtz_cron_triggers}
- property: {name: quartz.qrtz_cron_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_CRON_TRIGGERS}
- property: {name: quartz.qrtz_fired_triggers.name, dbms: "postgresql", value: qrtz_fired_triggers}
- property: {name: quartz.qrtz_fired_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_FIRED_TRIGGERS}
- property: {name: quartz.qrtz_job_details.name, dbms: "postgresql", value: qrtz_job_details}
- property: {name: quartz.qrtz_job_details.name, dbms: "mysql,mariadb,h2", value: QRTZ_JOB_DETAILS}
- property: {name: quartz.qrtz_locks.name, dbms: "postgresql", value: qrtz_locks}
- property: {name: quartz.qrtz_locks.name, dbms: "mysql,mariadb,h2", value: QRTZ_LOCKS}
- property: {name: quartz.qrtz_paused_trigger_grps.name, dbms: "postgresql", value: qrtz_paused_trigger_grps}
- property: {name: quartz.qrtz_paused_trigger_grps.name, dbms: "mysql,mariadb,h2", value: QRTZ_PAUSED_TRIGGER_GRPS}
- property: {name: quartz.qrtz_scheduler_state.name, dbms: "postgresql", value: qrtz_scheduler_state}
- property: {name: quartz.qrtz_scheduler_state.name, dbms: "mysql,mariadb,h2", value: QRTZ_SCHEDULER_STATE}
- property: {name: quartz.qrtz_simple_triggers.name, dbms: "postgresql", value: qrtz_simple_triggers}
- property: {name: quartz.qrtz_simple_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_SIMPLE_TRIGGERS}
- property: {name: quartz.qrtz_simprop_triggers.name, dbms: "postgresql", value: qrtz_simprop_triggers}
- property: {name: quartz.qrtz_simprop_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_SIMPROP_TRIGGERS}
- property: {name: quartz.qrtz_triggers.name, dbms: "postgresql", value: qrtz_triggers}
- property: {name: quartz.qrtz_triggers.name, dbms: "mysql,mariadb,h2", value: QRTZ_TRIGGERS}
- property: {name: quartz.repeat_count.name, dbms: "postgresql", value: repeat_count}
- property: {name: quartz.repeat_count.name, dbms: "mysql,mariadb,h2", value: REPEAT_COUNT}
- property: {name: quartz.repeat_interval.name, dbms: "postgresql", value: repeat_interval}
- property: {name: quartz.repeat_interval.name, dbms: "mysql,mariadb,h2", value: REPEAT_INTERVAL}
- property: {name: quartz.requests_recovery.name, dbms: "postgresql", value: requests_recovery}
- property: {name: quartz.requests_recovery.name, dbms: "mysql,mariadb,h2", value: REQUESTS_RECOVERY}
- property: {name: quartz.sched_name.name, dbms: "postgresql", value: sched_name}
- property: {name: quartz.sched_name.name, dbms: "mysql,mariadb,h2", value: SCHED_NAME}
- property: {name: quartz.sched_time.name, dbms: "postgresql", value: sched_time}
- property: {name: quartz.sched_time.name, dbms: "mysql,mariadb,h2", value: SCHED_TIME}
- property: {name: quartz.start_time.name, dbms: "postgresql", value: start_time}
- property: {name: quartz.start_time.name, dbms: "mysql,mariadb,h2", value: START_TIME}
- property: {name: quartz.state.name, dbms: "postgresql", value: state}
- property: {name: quartz.state.name, dbms: "mysql,mariadb,h2", value: STATE}
- property: {name: quartz.str_prop_1.name, dbms: "postgresql", value: str_prop_1}
- property: {name: quartz.str_prop_1.name, dbms: "mysql,mariadb,h2", value: STR_PROP_1}
- property: {name: quartz.str_prop_2.name, dbms: "postgresql", value: str_prop_2}
- property: {name: quartz.str_prop_2.name, dbms: "mysql,mariadb,h2", value: STR_PROP_2}
- property: {name: quartz.str_prop_3.name, dbms: "postgresql", value: str_prop_3}
- property: {name: quartz.str_prop_3.name, dbms: "mysql,mariadb,h2", value: STR_PROP_3}
- property: {name: quartz.times_triggered.name, dbms: "postgresql", value: times_triggered}
- property: {name: quartz.times_triggered.name, dbms: "mysql,mariadb,h2", value: TIMES_TRIGGERED}
- property: {name: quartz.time_zone_id.name, dbms: "postgresql", value: time_zone_id}
- property: {name: quartz.time_zone_id.name, dbms: "mysql,mariadb,h2", value: TIME_ZONE_ID}
- property: {name: quartz.trigger_group.name, dbms: "postgresql", value: trigger_group}
- property: {name: quartz.trigger_group.name, dbms: "mysql,mariadb,h2", value: TRIGGER_GROUP}
- property: {name: quartz.trigger_name.name, dbms: "postgresql", value: trigger_name}
- property: {name: quartz.trigger_name.name, dbms: "mysql,mariadb,h2", value: TRIGGER_NAME}
- property: {name: quartz.trigger_state.name, dbms: "postgresql", value: trigger_state}
- property: {name: quartz.trigger_state.name, dbms: "mysql,mariadb,h2", value: TRIGGER_STATE}
- property: {name: quartz.trigger_type.name, dbms: "postgresql", value: trigger_type}
- property: {name: quartz.trigger_type.name, dbms: "mysql,mariadb,h2", value: TRIGGER_TYPE}
- changeSet:
id: 89
author: camsaul
comment: Added 0.30.0
validCheckSum: ANY
changes:
- createTable:
tableName: ${quartz.qrtz_job_details.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.job_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.job_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.description.name}
type: varchar(250)
- column:
name: ${quartz.job_class_name.name}
type: varchar(250)
constraints:
nullable: false
- column:
name: ${quartz.is_durable.name}
type: bool
constraints:
nullable: false
- column:
name: ${quartz.is_nonconcurrent.name}
type: bool
constraints:
nullable: false
- column:
name: ${quartz.is_update_data.name}
type: bool
constraints:
nullable: false
- column:
name: ${quartz.requests_recovery.name}
type: bool
constraints:
nullable: false
- column:
name: ${quartz.job_data.name}
type: ${blob.type}
- addPrimaryKey:
tableName: ${quartz.qrtz_job_details.name}
columnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name}
constraintName: ${quartz.pk_qrtz_job_details.name}
- createTable:
tableName: ${quartz.qrtz_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.job_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.job_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.description.name}
type: varchar(250)
- column:
name: ${quartz.next_fire_time.name}
type: bigint
- column:
name: ${quartz.prev_fire_time.name}
type: bigint
- column:
name: ${quartz.priority.name}
type: integer
- column:
name: ${quartz.trigger_state.name}
type: varchar(16)
constraints:
nullable: false
- column:
name: ${quartz.trigger_type.name}
type: varchar(8)
constraints:
nullable: false
- column:
name: ${quartz.start_time.name}
type: bigint
constraints:
nullable: false
- column:
name: ${quartz.end_time.name}
type: bigint
- column:
name: ${quartz.calendar_name.name}
type: varchar(200)
- column:
name: ${quartz.misfire_instr.name}
type: smallint
- column:
name: ${quartz.job_data.name}
type: ${blob.type}
- addPrimaryKey:
tableName: ${quartz.qrtz_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_qrtz_triggers.name}
- addForeignKeyConstraint:
baseTableName: ${quartz.qrtz_triggers.name}
baseColumnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name}
referencedTableName: ${quartz.qrtz_job_details.name}
referencedColumnNames: ${quartz.sched_name.name}, ${quartz.job_name.name}, ${quartz.job_group.name}
constraintName: ${quartz.fk_qrtz_triggers_job_details.name}
- createTable:
tableName: ${quartz.qrtz_simple_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.repeat_count.name}
type: bigint
constraints:
nullable: false
- column:
name: ${quartz.repeat_interval.name}
type: bigint
constraints:
nullable: false
- column:
name: ${quartz.times_triggered.name}
type: bigint
constraints:
nullable: false
- addPrimaryKey:
tableName: ${quartz.qrtz_simple_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_qrtz_simple_triggers.name}
- addForeignKeyConstraint:
baseTableName: ${quartz.qrtz_simple_triggers.name}
baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
referencedTableName: ${quartz.qrtz_triggers.name}
referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.fk_qrtz_simple_triggers_triggers.name}
- createTable:
tableName: ${quartz.qrtz_cron_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.cron_expression.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.time_zone_id.name}
type: varchar(80)
- addPrimaryKey:
tableName: ${quartz.qrtz_cron_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_qrtz_cron_triggers.name}
- addForeignKeyConstraint:
baseTableName: ${quartz.qrtz_cron_triggers.name}
baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
referencedTableName: ${quartz.qrtz_triggers.name}
referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.fk_qrtz_cron_triggers_triggers.name}
- createTable:
tableName: ${quartz.qrtz_simprop_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.str_prop_1.name}
type: varchar(512)
- column:
name: ${quartz.str_prop_2.name}
type: varchar(512)
- column:
name: ${quartz.str_prop_3.name}
type: varchar(512)
- column:
name: ${quartz.int_prop_1.name}
type: int
- column:
name: ${quartz.int_prop_2.name}
type: int
- column:
name: ${quartz.long_prop_1.name}
type: bigint
- column:
name: ${quartz.long_prop_2.name}
type: bigint
- column:
name: ${quartz.dec_prop_1.name}
type: numeric(13,4)
- column:
name: ${quartz.dec_prop_2.name}
type: numeric(13,4)
- column:
name: ${quartz.bool_prop_1.name}
type: bool
- column:
name: ${quartz.bool_prop_2.name}
type: bool
- addPrimaryKey:
tableName: ${quartz.qrtz_simprop_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_qrtz_simprop_triggers.name}
- addForeignKeyConstraint:
baseTableName: ${quartz.qrtz_simprop_triggers.name}
baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
referencedTableName: ${quartz.qrtz_triggers.name}
referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.fk_qrtz_simprop_triggers_triggers.name}
- createTable:
tableName: ${quartz.qrtz_blob_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.blob_data.name}
type: ${blob.type}
- addPrimaryKey:
tableName: ${quartz.qrtz_blob_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_qrtz_blob_triggers.name}
- addForeignKeyConstraint:
baseTableName: ${quartz.qrtz_blob_triggers.name}
baseColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
referencedTableName: ${quartz.qrtz_triggers.name}
referencedColumnNames: ${quartz.sched_name.name}, ${quartz.trigger_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.fk_qrtz_blob_triggers_triggers.name}
- createTable:
tableName: ${quartz.qrtz_calendars.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.calendar_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.calendar.name}
type: ${blob.type}
constraints:
nullable: false
- addPrimaryKey:
tableName: ${quartz.qrtz_calendars.name}
columnNames: ${quartz.sched_name.name}, ${quartz.calendar_name.name}
constraintName: ${quartz.pk_qrtz_calendars.name}
- createTable:
tableName: ${quartz.qrtz_paused_trigger_grps.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- addPrimaryKey:
tableName: ${quartz.qrtz_paused_trigger_grps.name}
columnNames: ${quartz.sched_name.name}, ${quartz.trigger_group.name}
constraintName: ${quartz.pk_sched_name.name}
- createTable:
tableName: ${quartz.qrtz_fired_triggers.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.entry_id.name}
type: varchar(95)
constraints:
nullable: false
- column:
name: ${quartz.trigger_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.trigger_group.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.instance_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.fired_time.name}
type: bigint
constraints:
nullable: false
# Note: this column is not used on Quartz 2.1.x; it is used in 2.2.x, which recommends making it NOT NULL. I've made it
# nullable since at the time of this migration we're still using 2.1.7; including it gives us an easy upgrade path in
# the future.
- column:
name: ${quartz.sched_time.name}
type: bigint
- column:
name: ${quartz.priority.name}
type: integer
constraints:
nullable: false
- column:
name: ${quartz.state.name}
type: varchar(16)
constraints:
nullable: false
- column:
name: ${quartz.job_name.name}
type: varchar(200)
- column:
name: ${quartz.job_group.name}
type: varchar(200)
- column:
name: ${quartz.is_nonconcurrent.name}
type: bool
- column:
name: ${quartz.requests_recovery.name}
type: bool
- addPrimaryKey:
tableName: ${quartz.qrtz_fired_triggers.name}
columnNames: ${quartz.sched_name.name}, ${quartz.entry_id.name}
constraintName: ${quartz.pk_qrtz_fired_triggers.name}
- createTable:
tableName: ${quartz.qrtz_scheduler_state.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.instance_name.name}
type: varchar(200)
constraints:
nullable: false
- column:
name: ${quartz.last_checkin_time.name}
type: bigint
constraints:
nullable: false
- column:
name: ${quartz.checkin_interval.name}
type: bigint
constraints:
nullable: false
- addPrimaryKey:
tableName: ${quartz.qrtz_scheduler_state.name}
columnNames: ${quartz.sched_name.name}, ${quartz.instance_name.name}
constraintName: ${quartz.pk_qrtz_scheduler_state.name}
- createTable:
tableName: ${quartz.qrtz_locks.name}
remarks: Used for Quartz scheduler.
columns:
- column:
name: ${quartz.sched_name.name}
type: varchar(120)
constraints:
nullable: false
- column:
name: ${quartz.lock_name.name}
type: varchar(40)
constraints:
nullable: false
- addPrimaryKey:
tableName: ${quartz.qrtz_locks.name}
columnNames: ${quartz.sched_name.name}, ${quartz.lock_name.name}
constraintName: ${quartz.pk_qrtz_locks.name}
- createIndex:
indexName: ${quartz.idx_qrtz_j_req_recovery.name}
tableName: ${quartz.qrtz_job_details.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.requests_recovery.name}
- createIndex:
indexName: ${quartz.idx_qrtz_j_grp.name}
tableName: ${quartz.qrtz_job_details.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.job_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_j.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.job_name.name}
- column:
name: ${quartz.job_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_jg.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.job_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_c.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.calendar_name.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_g.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_state.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_state.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_n_state.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_name.name}
- column:
name: ${quartz.trigger_group.name}
- column:
name: ${quartz.trigger_state.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_n_g_state.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_group.name}
- column:
name: ${quartz.trigger_state.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_next_fire_time.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.next_fire_time.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_nft_st.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_state.name}
- column:
name: ${quartz.next_fire_time.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_nft_misfire.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.misfire_instr.name}
- column:
name: ${quartz.next_fire_time.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_nft_st_misfire.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.misfire_instr.name}
- column:
name: ${quartz.next_fire_time.name}
- column:
name: ${quartz.trigger_state.name}
- createIndex:
indexName: ${quartz.idx_qrtz_t_nft_st_misfire_grp.name}
tableName: ${quartz.qrtz_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.misfire_instr.name}
- column:
name: ${quartz.next_fire_time.name}
- column:
name: ${quartz.trigger_group.name}
- column:
name: ${quartz.trigger_state.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_trig_inst_name.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.instance_name.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_inst_job_req_rcvry.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.instance_name.name}
- column:
name: ${quartz.requests_recovery.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_j_g.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.job_name.name}
- column:
name: ${quartz.job_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_jg.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.job_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_t_g.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_name.name}
- column:
name: ${quartz.trigger_group.name}
- createIndex:
indexName: ${quartz.idx_qrtz_ft_tg.name}
tableName: ${quartz.qrtz_fired_triggers.name}
columns:
- column:
name: ${quartz.sched_name.name}
- column:
name: ${quartz.trigger_group.name}
- changeSet:
id: 90
author: senior
comment: 'Added 0.30.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: sso_source
type: varchar(254)
remarks: 'String to indicate the SSO backend the user is from'
- sql:
sql: update core_user set sso_source='saml' where saml_auth=true
- dropColumn:
tableName: core_user
columnName: saml_auth
# Forgot to get rid of the raw_table_id and raw_column_id columns when we dropped the tables they referenced in migration 87.
- changeSet:
id: 91
author: camsaul
comment: 'Added 0.30.0'
changes:
- dropColumn:
tableName: metabase_table
columnName: raw_table_id
- dropColumn:
tableName: metabase_field
columnName: raw_column_id
# Add database_id column to query_execution
- changeSet:
id: 92
author: camsaul
comment: 'Added 0.31.0'
validCheckSum: ANY
changes:
- addColumn:
tableName: query_execution
columns:
- column:
name: database_id
type: integer
remarks: 'ID of the database this query was ran against.'
# Start recording the actual query dictionary that's been executed
- changeSet:
id: 93
author: camsaul
comment: 'Added 0.31.0'
changes:
- addColumn:
tableName: query
columns:
- column:
name: query
type: text
remarks: 'The actual "query dictionary" for this query.'
# Create the TaskHistory table, intended to provide debugging info on our background/quartz processes
- changeSet:
id: 94
author: senior
comment: 'Added 0.31.0'
changes:
- createTable:
tableName: task_history
remarks: 'Timing and metadata info about background/quartz processes'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: task
type: VARCHAR(254)
remarks: 'Name of the task'
constraints:
nullable: false
# The sync tasks all have a db_id, but there are others that won't, such as the pulses
# task or task history cleanup. The way around this is to create a join table between
# TASK_HISTORY and METABASE_DATABASE, but that doesn't seem worth it right now.
- column:
name: db_id
type: integer
- column:
name: started_at
type: datetime
constraints:
nullable: false
- column:
name: ended_at
type: datetime
constraints:
nullable: false
- column:
name: duration
type: int
constraints:
nullable: false
- column:
name: task_details
remarks: 'JSON string with additional info on the task'
type: text
- createIndex:
indexName: idx_task_history_end_time
tableName: task_history
columns:
- column:
name: ended_at
- createIndex:
indexName: idx_task_history_db_id
tableName: task_history
columns:
- column:
name: db_id
# Before this changeset, the databasechangelog table didn't include any uniqueness constraing for the databasechangelog
# table. Not having anything that uniquely identifies a row can cause issues for database replication. In earlier
# versions of Liquibase the uniquenes constraint was (ID, AUTHOR, FILENAME) but that was dropped
# (https://liquibase.jira.com/browse/CORE-1909) as some as the combination of the three columns caused issues on some
# databases. We only support PostgreSQL, MySQL and H2 which doesn't have that issue. This changeset puts back that
# uniqueness constraint since the issue shouldn't affect us and it will allow replication without the user needed to
# add their own constraint.
- changeSet:
id: 95
author: senior
comment: 'Added 0.31.0'
validCheckSum: ANY
# Don't add the constraint if there are already duplicates in the database change log! Migrations will fail!
# See #8909
preConditions:
- onFail: MARK_RAN
# If we're dumping the migration as a SQL file or trying to force-migrate we can't check the preconditions
# so just go ahead and skip the entire thing. This is a non-critical migration
- onUpdateSQL: IGNORE
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM (SELECT count(*) FROM DATABASECHANGELOG GROUP BY ID, AUTHOR, FILENAME HAVING count(*) > 1) t1
changes:
- addUniqueConstraint:
columnNames: id, author, filename
constraintName: idx_databasechangelog_id_author_filename
tableName: ${databasechangelog.name}
#
# ADD Field.settings COLUMN
#
- changeSet:
id: 96
author: camsaul
comment: 'Added 0.31.0'
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: settings
type: text
remarks: 'Serialized JSON FE-specific settings like formatting, etc. Scope of what is stored here may increase in future.'
#
# Change MySQL/Maria's blob type to LONGBLOB to more closely match what H2 and PostgreSQL support for size limits
#
- changeSet:
id: 97
author: senior
comment: 'Added 0.32.0'
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
changes:
- modifyDataType:
tableName: query_cache
columnName: results
newDataType: longblob
#
# Add unique constraints for (Field name + table_id + parent_id) and for (Table name + schema + db_id) unless for one
# reason or another those would-be constraints are already violated. This is to fix issue where sometimes the same Field
# or Table is synced more than once (see #669, #8950, #9048)
#
# Note that the SQL standard says unique constraints should not apply to columns with NULL values. Consider the following:
#
# INSERT INTO metabase_table (db_id, schema, name) VALUES (1, 'PUBLIC', 'my_table');
# INSERT INTO metabase_table (db_id, schema, name) VALUES (1, 'PUBLIC', 'my_table'); -- fails: violates UNIQUE constraint
#
# INSERT INTO metabase_table (db_id, schema, name) VALUES (1, NULL, 'my_table');
# INSERT INTO metabase_table (db_id, schema, name) VALUES (1, NULL, 'my_table'); -- succeeds: because schema is NULL constraint does not apply
#
# Thus these constraints won't work if the data warehouse DB in question doesn't use schemas (e.g. MySQL or MongoDB). It
# will work for other data warehouse types.
#
# Luckily Postgres (but not H2 or MySQL) supports constraints that only apply to columns matching conditions, so we can
# add additional constraints to properly handle those cases.
- changeSet:
id: 98
author: camsaul
validCheckSum: 8:f036d20a4dc86fb60ffb64ea838ed6b9
comment: 'Added 0.32.0'
preConditions:
- onFail: MARK_RAN
- onUpdateSQL: IGNORE
- or:
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM (SELECT count(*) FROM `metabase_table` GROUP BY `db_id`, `schema`, `name` HAVING count(*) > 1) t1
- and:
- dbms:
type: h2,postgresql
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM (SELECT count(*) FROM METABASE_TABLE GROUP BY DB_ID, SCHEMA, NAME HAVING count(*) > 1) t1
changes:
- addUniqueConstraint:
tableName: metabase_table
columnNames: db_id, schema, name
constraintName: idx_uniq_table_db_id_schema_name
# For Postgres, add additional constraint to apply if schema is NULL
- sql:
dbms: postgresql
sql: CREATE UNIQUE INDEX idx_uniq_table_db_id_schema_name_2col ON "metabase_table" ("db_id", "name") WHERE "schema" IS NULL
- changeSet:
id: 99
author: camsaul
validCheckSum: 8:274bb516dd95b76c954b26084eed1dfe
comment: 'Added 0.32.0'
preConditions:
- onFail: MARK_RAN
- onUpdateSQL: IGNORE
- or:
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM (SELECT count(*) FROM `metabase_field` GROUP BY `table_id`, `parent_id`, `name` HAVING count(*) > 1) t1
- and:
- dbms:
type: h2,postgresql
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM (SELECT count(*) FROM METABASE_FIELD GROUP BY TABLE_ID, PARENT_ID, NAME HAVING count(*) > 1) t1
changes:
- addUniqueConstraint:
tableName: metabase_field
columnNames: table_id, parent_id, name
constraintName: idx_uniq_field_table_id_parent_id_name
# For Postgres, add additional constraint to apply if schema is NULL
- sql:
dbms: postgresql
sql: CREATE UNIQUE INDEX idx_uniq_field_table_id_parent_id_name_2col ON "metabase_field" ("table_id", "name") WHERE "parent_id" IS NULL
#
# Migration 84 was written slightly incorrectly and did not correctly migrate the values of is_active -> archived for
# METRICS. If you look at the migration you will notice the raw SQL part is a `sql` map with 2 `sql` keys. The first key
# is ignored, and that statement was never ran.
#
# To fix this we will migrate any metrics that haven't been updated since that migration ran and fix their archived
# status
- changeSet:
id: 100
author: camsaul
comment: 'Added 0.32.0'
validCheckSum: ANY
changes:
# databasechangelog is upper-case in MySQL and MariaDB (and H2 for that matter, but H2 will upper-case the
# unquoted identifier)
- sql:
dbms: postgresql,h2
sql: >-
UPDATE metric
SET archived = NOT archived
WHERE EXISTS (
SELECT *
FROM databasechangelog dbcl
WHERE dbcl.id = '84'
AND metric.updated_at < dbcl.dateexecuted
)
- sql:
dbms: mysql,mariadb
sql: >-
UPDATE metric
SET archived = NOT archived
WHERE EXISTS (
SELECT *
FROM `DATABASECHANGELOG` dbcl
WHERE dbcl.id = '84'
AND metric.updated_at < dbcl.dateexecuted
)
# Very helpful for performance reasons. See #9519
- changeSet:
id: 101
author: camsaul
comment: 'Added 0.32.0'
changes:
- createIndex:
indexName: idx_field_parent_id
tableName: metabase_field
columns:
- column:
name: parent_id
# A per-Database setting for the new Query Builder 3.0.
- changeSet:
id: 103
author: camsaul
comment: 'Added 0.32.10'
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: auto_run_queries
remarks: 'Whether to automatically run queries when doing simple filtering and summarizing in the Query Builder.'
type: boolean
constraints:
nullable: false
defaultValueBoolean: true
# To fix EE full-app embedding without compromising security. Full-app embed sessions cannot have `SameSite` attributes in their cookies.
- changeSet:
id: 104
author: camsaul
comment: 'Added EE 1.1.6/CE 0.33.0'
changes:
- addColumn:
tableName: core_session
columns:
- column:
name: anti_csrf_token
type: text
remarks: 'Anti-CSRF token for full-app embed sessions.'
#
# Change `metabase_field.database_type` to `text` to accomodate more exotic field types (enums in Clickhouse, rows in Presto, ...)
#
- changeSet:
id: 106
author: sb
comment: 'Added 0.33.5'
changes:
- modifyDataType:
tableName: metabase_field
columnName: database_type
newDataType: text
#
# Migrations 107-160 are used to convert a MySQL or MariaDB database to utf8mb4 on launch -- see #11753 for a detailed explanation of these migrations
#
- changeSet:
id: 107
author: camsaul
comment: Added 0.34.2
# If this migration fails for any reason continue with the next migration; do not fail the entire process if this one fails
failOnError: false
preConditions:
# If preconditions fail (i.e., dbms is not mysql or mariadb) then mark this migration as 'ran'
- onFail: MARK_RAN
# If we're generating SQL output for migrations instead of running via liquibase, fail the preconditions which means these migrations will be skipped
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER DATABASE CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
- changeSet:
id: 108
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `DATABASECHANGELOG` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 109
author: camsaul
comment: Added 0.34.2, but not necessary anymore with the liquibase session lock
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: none
changes:
- sql:
sql: ALTER TABLE `DATABASECHANGELOGLOCK` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 110
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_CALENDARS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 111
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_FIRED_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 112
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_JOB_DETAILS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 113
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_LOCKS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 114
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_PAUSED_TRIGGER_GRPS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 115
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_SCHEDULER_STATE` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 116
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `core_user` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 117
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `data_migrations` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 118
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `dependency` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 119
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `label` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 120
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metabase_database` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 121
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `permissions_group` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 122
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `query` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 123
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `query_cache` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 124
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `query_execution` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 125
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `setting` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 126
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `task_history` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 127
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 128
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `activity` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 129
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `collection` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 130
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `collection_revision` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 131
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `computation_job` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 132
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `core_session` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 133
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metabase_table` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 134
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `permissions` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 135
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `permissions_revision` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 136
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `revision` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 137
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `view_log` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 138
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_BLOB_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 139
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_CRON_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 140
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_SIMPLE_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 141
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `QRTZ_SIMPROP_TRIGGERS` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 142
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `computation_job_result` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 143
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metabase_field` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 144
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `permissions_group_membership` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 145
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `pulse` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 146
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `report_dashboard` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 147
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `dashboard_favorite` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 148
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `dimension` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 149
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metabase_fieldvalues` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 150
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metric` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 151
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `pulse_channel` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 152
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `segment` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 153
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `pulse_channel_recipient` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 154
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `report_card` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 155
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `metric_important_field` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 156
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `report_cardfavorite` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 157
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `card_label` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 158
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `pulse_card` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 159
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `report_dashboardcard` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
- changeSet:
id: 160
author: camsaul
comment: Added 0.34.2
failOnError: false
preConditions:
- onFail: MARK_RAN
- onSqlOutput: FAIL
- or:
- dbms:
type: mysql
- dbms:
type: mariadb
changes:
- sql:
sql: ALTER TABLE `dashboardcard_series` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# [161 has been removed. Superceded by 166]
# Drop the old query_queryexecution table if present. This was replaced by query_execution in 0.23.0. This was
# formerly a data migration but was converted to a Liquibase migration so people running migrations manually will
# still have the Table dropped.
- changeSet:
id: 162
author: camsaul
comment: 'Added 0.23.0 as a data migration; converted to Liquibase migration in 0.35.0'
preConditions:
- onFail: MARK_RAN
- tableExists:
tableName: query_queryexecution
changes:
- dropTable:
tableName: query_queryexecution
# Drop Card.read_permissions. Prior to 0.30.0 Card permissions were always based on the Database/Table(s) being
# queried (i.e., the permissions model we use for ad-hoc queries). These permissions were calculated and stored in
# `read_permissions` for performance reasons. In 0.30.0, we switched to having Card permissions always be inherited
# from their parent Collection, and the column hasn't been used since then. Time to let it go.
- changeSet:
id: 163
author: camsaul
comment: 'Added 0.35.0'
changes:
- dropColumn:
tableName: report_card
columnName: read_permissions
# Add User `locale` -- when set, this User will see the Metabase in this Locale rather than the system default Locale
# (the `site-locale` Setting).
- changeSet:
id: 164
author: camsaul
comment: 'Added 0.35.0'
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: locale
remarks: 'Preferred ISO locale (language/country) code, e.g "en" or "en-US", for this User. Overrides site default.'
type: varchar(5)
# Add Field `database_position` to keep the order in which fields are ordered in the DB, `custom_position` for custom
# position; and Table `field_order` setting.
- changeSet:
id: 165
author: sb
comment: 'Added field_order to Table and database_position to Field'
validCheckSum: ANY
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: database_position
type: int
defaultValueNumeric: 0
constraints:
nullable: false
- addColumn:
tableName: metabase_field
columns:
- column:
name: custom_position
type: int
defaultValueNumeric: 0
constraints:
nullable: false
- addColumn:
tableName: metabase_table
columns:
- column:
name: field_order
type: varchar(254)
defaultValue: database
constraints:
nullable: false
- sql:
sql: update metabase_field set database_position = id
# Change field_values.updated_at and query_cache.updated_at from datetime to timestamp [with time zone] to get >
# second resolution on MySQL.
#
# query_cache.updated_at was originally converted to a timestamp in 161, but we used `timestamp` instead of
# `timestamp(6)`. It is converted correctly here.
- changeSet:
id: 166
author: camsaul
comment: Added 0.36.0/1.35.4
changes:
- modifyDataType:
tableName: metabase_fieldvalues
columnName: updated_at
newDataType: ${timestamp_type}
- modifyDataType:
tableName: query_cache
columnName: updated_at
newDataType: ${timestamp_type}
# Create the native query snippets table, intended to store snippets and their metadata
- changeSet:
id: 167
author: walterl, camsaul
validCheckSum: ANY
comment: 'Added 0.36.0'
changes:
# If an older version of this Table was created locally (during dev) drop it, we have an updated definition
- sql:
sql: drop table if exists native_query_snippet
- createTable:
tableName: native_query_snippet
remarks: 'Query snippets (raw text) to be substituted in native queries'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: name
type: VARCHAR(254)
remarks: 'Name of the query snippet'
constraints:
nullable: false
unique: true
- column:
name: description
type: text
- column:
name: content
type: text
remarks: 'Raw query snippet'
constraints:
nullable: false
- column:
name: creator_id
type: int
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_snippet_creator_id
# This primarily affects tests because under normal
# circumstances we don't delete Users, we just archive them
deleteCascade: true
- column:
name: archived
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- column:
name: created_at
type: ${timestamp_type}
# it seems like defaultValueComputed actaully just ends
# getting ignored anyway -- see
# https://stackoverflow.com/questions/58816496/force-liquibase-to-current-timestamp-instead-of-now
# We set a custom value for MySQL/MariaDB in MetabaseMySqlCreateTableSqlGenerator.java
defaultValueComputed: current_timestamp
constraints:
nullable: false
- column:
name: updated_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
# Needed to efficiently enforce the unique constraint on name and so we can lookup by name as well.
- createIndex:
tableName: native_query_snippet
indexName: idx_snippet_name
columns:
- column:
name: name
# Convert query execution from DATETIME to TIMESTAMP(6) so have normalize TZ
# offset and so MySQL/MariaDB has better than second precision
- changeSet:
id: 168
author: camsaul
comment: Added 0.36.0
changes:
- modifyDataType:
tableName: query_execution
columnName: started_at
newDataType: ${timestamp_type}
# Remove `Table.rows`, which hasn't been used for years now. Older versions of Metabase used to store the row count in
# this column but we disabled it a long time ago for performance reasons. Now it's time to remove it entirely.
- changeSet:
id: 169
author: camsaul
comment: Added 0.36.0
changes:
- dropColumn:
tableName: metabase_table
columnName: rows
# Remove fields_hash from Table model, as we no longer skip sync steps if metadata
# hash hasn't changed.
- changeSet:
id: 170
author: sb
comment: Added 0.36.0
changes:
- dropColumn:
tableName: metabase_table
columnName: fields_hash
# In EE, NativeQuerySnippets have a permissions system based on "snippet folders" which are Collections under the
# hood. However, these Collections live in a separate "namespace" -- a completely separate hierarchy of Collections.
- changeSet:
id: 171
author: camsaul
validCheckSum: ANY
comment: Added 0.36.0
changes:
- addColumn:
tableName: native_query_snippet
columns:
- column:
name: collection_id
type: int
remarks: 'ID of the Snippet Folder (Collection) this Snippet is in, if any'
constraints:
nullable: true
referencedTableName: collection
referencedColumnNames: id
foreignKeyName: fk_snippet_collection_id
- createIndex:
tableName: native_query_snippet
indexName: idx_snippet_collection_id
columns:
- column:
name: collection_id
- changeSet:
id: 172
author: camsaul
comment: Added 0.36.0
changes:
- addColumn:
tableName: collection
columns:
- column:
name: namespace
type: varchar(254)
remarks: 'The namespace (hierachy) this Collection belongs to. NULL means the Collection is in the default namespace.'
constraints:
nullable: true
# These migrations convert various FK constraints in the DB to ones with ON DELETE CASCADE so the DB can handle this
# instead of relying on Toucan pre-delete methods to do it, which are subject to race conditions.
# activity.user_id -> core_user.id
- changeSet:
id: 173
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: activity
constraintName: fk_activity_ref_user_id
- changeSet:
id: 174
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: activity
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_activity_ref_user_id
onDelete: CASCADE
# card_label.card_id -> report_card.id
- changeSet:
id: 175
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: card_label
constraintName: fk_card_label_ref_card_id
- changeSet:
id: 176
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: card_label
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_card_label_ref_card_id
onDelete: CASCADE
# card_label.label_id -> label.id
- changeSet:
id: 177
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: card_label
constraintName: fk_card_label_ref_label_id
- changeSet:
id: 178
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: card_label
baseColumnNames: label_id
referencedTableName: label
referencedColumnNames: id
constraintName: fk_card_label_ref_label_id
onDelete: CASCADE
# collection.personal_owner_id -> core_user.id
- changeSet:
id: 179
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: collection
constraintName: fk_collection_personal_owner_id
- changeSet:
id: 180
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: collection
baseColumnNames: personal_owner_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_collection_personal_owner_id
onDelete: CASCADE
# collection_revision.user_id -> core_user.id
- changeSet:
id: 181
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: collection_revision
constraintName: fk_collection_revision_user_id
- changeSet:
id: 182
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: collection_revision
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_collection_revision_user_id
onDelete: CASCADE
# computation_job.creator_id -> core_user.id
- changeSet:
id: 183
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: computation_job
constraintName: fk_computation_job_ref_user_id
- changeSet:
id: 184
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: computation_job
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_computation_job_ref_user_id
onDelete: CASCADE
# computation_job_result.job_id -> computation_job.id
- changeSet:
id: 185
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: computation_job_result
constraintName: fk_computation_result_ref_job_id
- changeSet:
id: 186
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: computation_job_result
baseColumnNames: job_id
referencedTableName: computation_job
referencedColumnNames: id
constraintName: fk_computation_result_ref_job_id
onDelete: CASCADE
# core_session.user_id -> core_user.id
- changeSet:
id: 187
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: core_session
constraintName: fk_session_ref_user_id
- changeSet:
id: 188
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: core_session
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_session_ref_user_id
onDelete: CASCADE
# dashboardcard_series.card_id -> report_card.id
- changeSet:
id: 189
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: dashboardcard_series
constraintName: fk_dashboardcard_series_ref_card_id
- changeSet:
id: 190
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: dashboardcard_series
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_dashboardcard_series_ref_card_id
onDelete: CASCADE
# dashboardcard_series.dashboardcard_id -> report_dashboardcard.id
- changeSet:
id: 191
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: dashboardcard_series
constraintName: fk_dashboardcard_series_ref_dashboardcard_id
- changeSet:
id: 192
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: dashboardcard_series
baseColumnNames: dashboardcard_id
referencedTableName: report_dashboardcard
referencedColumnNames: id
constraintName: fk_dashboardcard_series_ref_dashboardcard_id
onDelete: CASCADE
# group_table_access_policy.card_id -> report_card.id
- changeSet:
id: 193
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: group_table_access_policy
constraintName: fk_gtap_card_id
- changeSet:
id: 194
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: group_table_access_policy
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_gtap_card_id
onDelete: CASCADE
# metabase_field.parent_id -> metabase_field.id
- changeSet:
id: 195
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metabase_field
constraintName: fk_field_parent_ref_field_id
- changeSet:
id: 196
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metabase_field
baseColumnNames: parent_id
referencedTableName: metabase_field
referencedColumnNames: id
constraintName: fk_field_parent_ref_field_id
onDelete: CASCADE
# metabase_field.table_id -> metabase_table.id
- changeSet:
id: 197
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metabase_field
constraintName: fk_field_ref_table_id
- changeSet:
id: 198
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metabase_field
baseColumnNames: table_id
referencedTableName: metabase_table
referencedColumnNames: id
constraintName: fk_field_ref_table_id
onDelete: CASCADE
# metabase_fieldvalues.field_id -> metabase_field.id
- changeSet:
id: 199
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metabase_fieldvalues
constraintName: fk_fieldvalues_ref_field_id
- changeSet:
id: 200
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metabase_fieldvalues
baseColumnNames: field_id
referencedTableName: metabase_field
referencedColumnNames: id
constraintName: fk_fieldvalues_ref_field_id
onDelete: CASCADE
# metabase_table.db_id -> metabase_database.id
- changeSet:
id: 201
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metabase_table
constraintName: fk_table_ref_database_id
- changeSet:
id: 202
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metabase_table
baseColumnNames: db_id
referencedTableName: metabase_database
referencedColumnNames: id
constraintName: fk_table_ref_database_id
onDelete: CASCADE
# metric.creator_id -> core_user.id
- changeSet:
id: 203
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metric
constraintName: fk_metric_ref_creator_id
- changeSet:
id: 204
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metric
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_metric_ref_creator_id
onDelete: CASCADE
# metric.table_id -> metabase_table.id
- changeSet:
id: 205
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metric
constraintName: fk_metric_ref_table_id
- changeSet:
id: 206
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metric
baseColumnNames: table_id
referencedTableName: metabase_table
referencedColumnNames: id
constraintName: fk_metric_ref_table_id
onDelete: CASCADE
# metric_important_field.field_id -> metabase_field.id
- changeSet:
id: 207
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metric_important_field
constraintName: fk_metric_important_field_metabase_field_id
- changeSet:
id: 208
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metric_important_field
baseColumnNames: field_id
referencedTableName: metabase_field
referencedColumnNames: id
constraintName: fk_metric_important_field_metabase_field_id
onDelete: CASCADE
# metric_important_field.metric_id -> metric.id
- changeSet:
id: 209
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: metric_important_field
constraintName: fk_metric_important_field_metric_id
- changeSet:
id: 210
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: metric_important_field
baseColumnNames: metric_id
referencedTableName: metric
referencedColumnNames: id
constraintName: fk_metric_important_field_metric_id
onDelete: CASCADE
# native_query_snippet.collection_id -> collection.id
- changeSet:
id: 211
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: native_query_snippet
constraintName: fk_snippet_collection_id
- changeSet:
id: 212
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: native_query_snippet
baseColumnNames: collection_id
referencedTableName: collection
referencedColumnNames: id
constraintName: fk_snippet_collection_id
onDelete: SET NULL
# permissions.group_id -> permissions_group.id
- changeSet:
id: 213
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: permissions
constraintName: fk_permissions_group_id
- changeSet:
id: 214
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: permissions
baseColumnNames: group_id
referencedTableName: permissions_group
referencedColumnNames: id
constraintName: fk_permissions_group_id
onDelete: CASCADE
# permissions_group_membership.group_id -> permissions_group.id
- changeSet:
id: 215
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: permissions_group_membership
constraintName: fk_permissions_group_group_id
- changeSet:
id: 216
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: permissions_group_membership
baseColumnNames: group_id
referencedTableName: permissions_group
referencedColumnNames: id
constraintName: fk_permissions_group_group_id
onDelete: CASCADE
# permissions_group_membership.user_id -> core_user.id
- changeSet:
id: 217
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: permissions_group_membership
constraintName: fk_permissions_group_membership_user_id
- changeSet:
id: 218
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: permissions_group_membership
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_permissions_group_membership_user_id
onDelete: CASCADE
# permissions_revision.user_id -> core_user.id
- changeSet:
id: 219
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: permissions_revision
constraintName: fk_permissions_revision_user_id
- changeSet:
id: 220
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: permissions_revision
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_permissions_revision_user_id
onDelete: CASCADE
# pulse.collection_id -> collection.id
- changeSet:
id: 221
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse
constraintName: fk_pulse_collection_id
- changeSet:
id: 222
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse
baseColumnNames: collection_id
referencedTableName: collection
referencedColumnNames: id
constraintName: fk_pulse_collection_id
onDelete: SET NULL
# pulse.creator_id -> core_user.id
- changeSet:
id: 223
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse
constraintName: fk_pulse_ref_creator_id
- changeSet:
id: 224
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_pulse_ref_creator_id
onDelete: CASCADE
# pulse_card.card_id -> report_card.id
- changeSet:
id: 225
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_card
constraintName: fk_pulse_card_ref_card_id
- changeSet:
id: 226
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse_card
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_pulse_card_ref_card_id
onDelete: CASCADE
# pulse_card.pulse_id -> pulse.id
- changeSet:
id: 227
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_card
constraintName: fk_pulse_card_ref_pulse_id
- changeSet:
id: 228
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse_card
baseColumnNames: pulse_id
referencedTableName: pulse
referencedColumnNames: id
constraintName: fk_pulse_card_ref_pulse_id
onDelete: CASCADE
# pulse_channel.pulse_id -> pulse.id
- changeSet:
id: 229
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_channel
constraintName: fk_pulse_channel_ref_pulse_id
- changeSet:
id: 230
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse_channel
baseColumnNames: pulse_id
referencedTableName: pulse
referencedColumnNames: id
constraintName: fk_pulse_channel_ref_pulse_id
onDelete: CASCADE
# pulse_channel_recipient.pulse_channel_id -> pulse_channel.id
- changeSet:
id: 231
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_channel_recipient
constraintName: fk_pulse_channel_recipient_ref_pulse_channel_id
- changeSet:
id: 232
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse_channel_recipient
baseColumnNames: pulse_channel_id
referencedTableName: pulse_channel
referencedColumnNames: id
constraintName: fk_pulse_channel_recipient_ref_pulse_channel_id
onDelete: CASCADE
# pulse_channel_recipient.user_id -> core_user.id
- changeSet:
id: 233
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_channel_recipient
constraintName: fk_pulse_channel_recipient_ref_user_id
- changeSet:
id: 234
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: pulse_channel_recipient
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_pulse_channel_recipient_ref_user_id
onDelete: CASCADE
# report_card.collection_id -> collection.id
- changeSet:
id: 235
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_card_collection_id
- changeSet:
id: 236
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_card
baseColumnNames: collection_id
referencedTableName: collection
referencedColumnNames: id
constraintName: fk_card_collection_id
onDelete: SET NULL
# report_card.made_public_by_id -> core_user.id
- changeSet:
id: 237
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_card_made_public_by_id
- changeSet:
id: 238
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_card
baseColumnNames: made_public_by_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_card_made_public_by_id
onDelete: CASCADE
# report_card.creator_id -> core_user.id
- changeSet:
id: 239
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_card_ref_user_id
- changeSet:
id: 240
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_card
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_card_ref_user_id
onDelete: CASCADE
# report_card.database_id -> metabase_database.id
- changeSet:
id: 241
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_report_card_ref_database_id
- changeSet:
id: 242
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_card
baseColumnNames: database_id
referencedTableName: metabase_database
referencedColumnNames: id
constraintName: fk_report_card_ref_database_id
onDelete: CASCADE
# report_card.table_id -> metabase_table.id
- changeSet:
id: 243
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_card
constraintName: fk_report_card_ref_table_id
- changeSet:
id: 244
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_card
baseColumnNames: table_id
referencedTableName: metabase_table
referencedColumnNames: id
constraintName: fk_report_card_ref_table_id
onDelete: CASCADE
# report_cardfavorite.card_id -> report_card.id
- changeSet:
id: 245
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_cardfavorite
constraintName: fk_cardfavorite_ref_card_id
- changeSet:
id: 246
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_cardfavorite
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_cardfavorite_ref_card_id
onDelete: CASCADE
# report_cardfavorite.owner_id -> core_user.id
- changeSet:
id: 247
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_cardfavorite
constraintName: fk_cardfavorite_ref_user_id
- changeSet:
id: 248
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_cardfavorite
baseColumnNames: owner_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_cardfavorite_ref_user_id
onDelete: CASCADE
# report_dashboard.collection_id -> collection.id
- changeSet:
id: 249
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_dashboard
constraintName: fk_dashboard_collection_id
- changeSet:
id: 250
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_dashboard
baseColumnNames: collection_id
referencedTableName: collection
referencedColumnNames: id
constraintName: fk_dashboard_collection_id
onDelete: SET NULL
# report_dashboard.made_public_by_id -> core_user.id
- changeSet:
id: 251
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_dashboard
constraintName: fk_dashboard_made_public_by_id
- changeSet:
id: 252
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_dashboard
baseColumnNames: made_public_by_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_dashboard_made_public_by_id
onDelete: CASCADE
# report_dashboard.creator_id -> core_user.id
- changeSet:
id: 253
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_dashboard
constraintName: fk_dashboard_ref_user_id
- changeSet:
id: 254
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_dashboard
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_dashboard_ref_user_id
onDelete: CASCADE
# report_dashboardcard.card_id -> report_card.id
- changeSet:
id: 255
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_dashboardcard
constraintName: fk_dashboardcard_ref_card_id
- changeSet:
id: 256
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_dashboardcard
baseColumnNames: card_id
referencedTableName: report_card
referencedColumnNames: id
constraintName: fk_dashboardcard_ref_card_id
onDelete: CASCADE
# report_dashboardcard.dashboard_id -> report_dashboard.id
- changeSet:
id: 257
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: report_dashboardcard
constraintName: fk_dashboardcard_ref_dashboard_id
- changeSet:
id: 258
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: report_dashboardcard
baseColumnNames: dashboard_id
referencedTableName: report_dashboard
referencedColumnNames: id
constraintName: fk_dashboardcard_ref_dashboard_id
onDelete: CASCADE
# revision.user_id -> core_user.id
- changeSet:
id: 259
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: revision
constraintName: fk_revision_ref_user_id
- changeSet:
id: 260
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: revision
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_revision_ref_user_id
onDelete: CASCADE
# segment.creator_id -> core_user.id
- changeSet:
id: 261
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: segment
constraintName: fk_segment_ref_creator_id
- changeSet:
id: 262
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: segment
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_segment_ref_creator_id
onDelete: CASCADE
# segment.table_id -> metabase_table.id
- changeSet:
id: 263
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: segment
constraintName: fk_segment_ref_table_id
- changeSet:
id: 264
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: segment
baseColumnNames: table_id
referencedTableName: metabase_table
referencedColumnNames: id
constraintName: fk_segment_ref_table_id
onDelete: CASCADE
# view_log.user_id -> core_user.id
- changeSet:
id: 265
author: camsaul
comment: Added 0.36.0
changes:
- dropForeignKeyConstraint:
baseTableName: view_log
constraintName: fk_view_log_ref_user_id
- changeSet:
id: 266
author: camsaul
comment: Added 0.36.0
changes:
- addForeignKeyConstraint:
baseTableName: view_log
baseColumnNames: user_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_view_log_ref_user_id
onDelete: CASCADE
# changesets 268-272 allow for handling user account emails in lowercase (GH issue 3047)
- changeSet:
id: 268
author: rlotun
comment: Added 0.37.0 # create index on lower(email), for performance reasons (not availble on h2 and only on more recent versions of mysql)
failOnError: false
preConditions:
- onFail: MARK_RAN
- and:
- dbms:
type: postgresql
# This has maybe never succeeded in creating the index because (at least with the current DB versions)
# the syntax was wrong on all requested databases (postgresql, mysql and mariadb). Since this change is
# not critical it's OK to ignore it.
validCheckSum: 8:9da2f706a7cd42b5101601e0106fa929
changes:
- createIndex:
columns:
- column:
name: lower(email)
computed: true
type: varchar(254)
tableName: core_user
indexName: idx_lower_email
- changeSet:
id: 269
author: rlotun
comment: Added 0.37.0 # set email values to lower(email) but do so defensively and in a way that works on postgres and mysql - skip over those that would introduce duplicates (e.g. Reza@email.com and reza@email.com)
changes:
- sql :
sql : UPDATE core_user SET email = lower(email) WHERE lower(email) NOT IN (SELECT * FROM (SELECT lower(email) FROM core_user GROUP BY lower(email) HAVING count(email) > 1) as e)
- changeSet:
id: 270
author: rlotun
comment: Added 0.37.0 # try to install citext extension on posgres (user requires privileges on postgres)
failOnError: false
preConditions:
- onFail: MARK_RAN
- or:
- dbms:
type: postgresql
changes:
- sql :
sql : CREATE EXTENSION IF NOT EXISTS citext
- changeSet:
id: 271
author: rlotun
comment: Added 0.37.0 # try to convert email column to citext on postgres, if citext extension installed
failOnError: false
preConditions:
- onFail: MARK_RAN
- and:
- dbms:
type: postgresql
- sqlCheck:
expectedResult: 1
sql: SELECT count(*) FROM pg_extension WHERE extname = 'citext'
changes:
- modifyDataType:
tableName: core_user
columnName: email
newDataType: citext
- changeSet:
id: 272
author: rlotun
comment: Added 0.37.0 # for H2 convert column to VARCHAR_IGNORECASE
failOnError: false
preConditions:
- onFail: MARK_RAN
- or:
- dbms:
type: h2
changes:
- modifyDataType:
tableName: core_user
columnName: email
newDataType: varchar_ignorecase(254)
- changeSet:
id: 273
author: camsaul
comment: Added 0.37.1
changes:
- addDefaultValue:
tableName: core_user
columnName: is_superuser
columnDataType: boolean
defaultValueBoolean: false
- changeSet:
id: 274
author: camsaul
comment: Added 0.37.1
changes:
- addDefaultValue:
tableName: core_user
columnName: is_active
columnDataType: boolean
defaultValueBoolean: true
# Add refingerprint to database to mark if fingerprinting or
# not. Nullable in first pass so can be opt in and then in a
# subsequent pass can be globally turned on where null, respecting
# people who turned it on and then off.
- changeSet:
id: 275
author: dpsutton
comment: 'Added 0.38.0 refingerprint to Database'
validCheckSum: ANY
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: refingerprint
type: boolean
remarks: 'Whether or not to enable periodic refingerprinting for this Database.'
constraints:
nullable: true
- changeSet:
id: 276
author: robroland
comment: Added 0.38.0 - Dashboard subscriptions
validCheckSum: ANY
changes:
- addColumn:
tableName: pulse_card
columns:
- column:
name: dashboard_card_id
type: int
remarks: 'If this Pulse is a Dashboard subscription, the ID of the DashboardCard that corresponds to this PulseCard.'
constraints:
nullable: true
referencedTableName: report_dashboardcard
referencedColumnNames: id
foreignKeyName: fk_pulse_card_ref_pulse_card_id
deferrable: false
initiallyDeferred: false
- changeSet:
id: 277
author: tsmacdonald
comment: Added 0.38.0 - Dashboard subscriptions
changes:
- dropForeignKeyConstraint:
baseTableName: pulse_card
constraintName: fk_pulse_card_ref_pulse_card_id
- changeSet:
id: 278
author: tsmacdonald
comment: Added 0.38.0 - Dashboard subscrptions
changes:
- addForeignKeyConstraint:
baseTableName: pulse_card
baseColumnNames: dashboard_card_id
referencedTableName: report_dashboardcard
referencedColumnNames: id
constraintName: fk_pulse_card_ref_pulse_card_id
onDelete: CASCADE
- changeSet:
id: 279
author: camsaul
comment: Added 0.38.0 - Dashboard subscriptions
changes:
- addColumn:
tableName: pulse
columns:
- column:
name: dashboard_id
type: int
remarks: 'ID of the Dashboard if this Pulse is a Dashboard Subscription.'
# FK constraint is added separately because deleteCascade doesn't work in addColumn -- see #14321
- changeSet:
id: 280
author: camsaul
comment: Added 0.38.0 - Dashboard subscriptions
changes:
- addForeignKeyConstraint:
baseTableName: pulse
baseColumnNames: dashboard_id
referencedTableName: report_dashboard
referencedColumnNames: id
constraintName: fk_pulse_ref_dashboard_id
onDelete: CASCADE
- changeSet:
id: 281
author: dpsutton
comment: Added 0.39 - Semantic type system - rename special_type
changes:
- renameColumn:
tableName: metabase_field
oldColumnName: special_type
newColumnName: semantic_type
columnDataType: varchar(255)
# Change the TaskHistory timestamp columns to higher-resolution columns: on MySQL, they previously only had *second*
# resolution, which caused annoying test failures and made it hard to correctly sort tasks that happened in quick
# succession.
#
# We have to give these columns default values as well, or MySQL is going to be very fussy about having two
# NOT NULL timestamp columns without default values at the same time.
#
# This is done in raw SQL because AFAIK there's no way in Liquibase to change a column type and give it a default
# value in a single statement, which we have to do to make MySQL happy.
- changeSet:
id: 282
author: camsaul
validCheckSum: 8:d4b8566ee11d9f8a3d6c8c9539f6526d
comment: Added 0.39.0
changes:
- sql:
dbms: h2
sql: |
ALTER TABLE task_history
ALTER COLUMN started_at timestamp with time zone DEFAULT current_timestamp NOT NULL;
- sql:
dbms: postgresql
sql: |
ALTER TABLE task_history
ALTER COLUMN started_at TYPE timestamp with time zone,
ALTER COLUMN started_at SET DEFAULT current_timestamp;
- sql:
dbms: mysql,mariadb
sql: |
ALTER TABLE task_history
MODIFY started_at timestamp(6) DEFAULT current_timestamp(6) NOT NULL;
- changeSet:
id: 283
author: camsaul
validCheckSum: 8:2220e1b1cdb57212820b96fa3107f7c3
comment: Added 0.39.0
changes:
- sql:
dbms: h2
sql: |
ALTER TABLE task_history
ALTER COLUMN ended_at timestamp with time zone DEFAULT current_timestamp NOT NULL;
- sql:
dbms: postgresql
sql: |
ALTER TABLE task_history
ALTER COLUMN ended_at TYPE timestamp with time zone,
ALTER COLUMN ended_at SET DEFAULT current_timestamp;
- sql:
dbms: mysql,mariadb
sql: |
ALTER TABLE task_history
MODIFY ended_at timestamp(6) DEFAULT current_timestamp(6) NOT NULL;
- changeSet:
id: 284
author: dpsutton
comment: Added 0.39 - Semantic type system - add effective type
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: effective_type
type: varchar(255)
remarks: 'The effective type of the field after any coercions.'
- changeSet:
id: 285
author: dpsutton
comment: Added 0.39 - Semantic type system - add coercion column
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: coercion_strategy
type: varchar(255)
remarks: 'A strategy to coerce the base_type into the effective_type.'
- changeSet:
id: 286
author: dpsutton
comment: Added 0.39 - Semantic type system - set effective_type default
changes:
- sql:
sql: UPDATE metabase_field set effective_type = base_type
- changeSet:
id: 287
author: dpsutton
comment: Added 0.39 - Semantic type system - migrate ISO8601 strings
validCheckSum: ANY
changes:
- sql:
sql: >-
UPDATE metabase_field
SET effective_type = (CASE semantic_type
WHEN 'type/ISO8601DateTimeString' THEN 'type/DateTime'
WHEN 'type/ISO8601TimeString' THEN 'type/Time'
WHEN 'type/ISO8601DateString' THEN 'type/Date'
END),
coercion_strategy = (CASE semantic_type
WHEN 'type/ISO8601DateTimeString' THEN 'Coercion/ISO8601->DateTime'
WHEN 'type/ISO8601TimeString' THEN 'Coercion/ISO8601->Time'
WHEN 'type/ISO8601DateString' THEN 'Coercion/ISO8601->Date'
END)
WHERE semantic_type IN ('type/ISO8601DateTimeString',
'type/ISO8601TimeString',
'type/ISO8601DateString');
## This includes values 'timestamp_milliseconds' and 'timestamp_seconds'. These are old "special_types" that were
## migrated in a data migration for version 0.20. But these migrations occur after all liquibase migrations so
## it would be possible for another type/UNIXTimestampSeconds to pop up after this migration that supposedly
## got rid of them all
- changeSet:
id: 288
author: dpsutton
comment: Added 0.39 - Semantic type system - migrate unix timestamps
validCheckSum: ANY
changes:
- sql:
sql: >-
UPDATE metabase_field
set effective_type = 'type/Instant',
coercion_strategy = (case semantic_type
WHEN 'type/UNIXTimestampSeconds' THEN 'Coercion/UNIXSeconds->DateTime'
WHEN 'timestamp_seconds' THEN 'Coercion/UNIXSeconds->DateTime'
WHEN 'type/UNIXTimestampMilliSeconds' THEN 'Coercion/UNIXMilliSeconds->DateTime'
WHEN 'timestamp_milliseconds' THEN 'Coercion/UNIXMilliSeconds->DateTime'
WHEN 'type/UNIXTimestampMicroSeconds' THEN 'Coercion/UNIXMicroSeconds->DateTime'
END)
WHERE semantic_type IN ('type/UNIXTimestampSeconds',
'type/UNIXTimestampMilliSeconds',
'type/UNIXTimestampMicroSeconds',
'timestamp_seconds',
'timestamp_milliseconds');
- changeSet:
id: 289
author: dpsutton
comment: Added 0.39 - Semantic type system - migrate unix timestamps (corrects typo- seconds was migrated correctly, not millis and micros)
validCheckSum: ANY
changes:
- sql:
sql: >-
UPDATE metabase_field
set effective_type = 'type/Instant',
coercion_strategy = (case semantic_type
WHEN 'type/UNIXTimestampMilliseconds' THEN 'Coercion/UNIXMilliSeconds->DateTime'
WHEN 'type/UNIXTimestampMicroseconds' THEN 'Coercion/UNIXMicroSeconds->DateTime'
END)
WHERE semantic_type IN ('type/UNIXTimestampMilliseconds',
'type/UNIXTimestampMicroseconds')
- changeSet:
id: 290
author: dpsutton
comment: Added 0.39 - Semantic type system - Clobber semantic_type where there was a coercion
changes:
- sql:
sql: UPDATE metabase_field set semantic_type = null where coercion_strategy is not null
# 291-297 create the new login history Table
- changeSet:
id: 291
author: camsaul
validCheckSum: ANY
comment: Added 0.39.0
changes:
- createTable:
tableName: login_history
remarks: "Keeps track of various logins for different users and additional info such as location and device"
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: timestamp
type: ${timestamp_type}
remarks: "When this login occurred."
defaultValueComputed: current_timestamp
constraints:
nullable: false
- column:
name: user_id
type: int
remarks: "ID of the User that logged in."
constraints:
foreignKeyName: fk_login_history_user_id
referencedTableName: core_user
referencedColumnNames: id
nullable: false
deleteCascade: true
# FK constraint is created later, because we can't create it inline with ON DELETE SET NULL
- column:
name: session_id
type: varchar(254)
remarks: "ID of the Session created by this login if one is currently active. NULL if Session is no longer active."
- column:
name: device_id
type: char(36)
remarks: "Cookie-based unique identifier for the device/browser the user logged in from."
constraints:
nullable: false
- column:
name: device_description
type: text
remarks: "Description of the device that login happened from, for example a user-agent string, but this might be something different if we support alternative auth mechanisms in the future."
constraints:
nullable: false
- column:
name: ip_address
type: text
remarks: "IP address of the device that login happened from, so we can geocode it and determine approximate location."
constraints:
nullable: false
- changeSet:
id: 292
author: camsaul
comment: Added 0.39.0
changes:
- createIndex:
tableName: login_history
indexName: idx_user_id
columns:
- column:
name: user_id
- changeSet:
id: 293
author: camsaul
comment: Added 0.39.0
changes:
- addForeignKeyConstraint:
baseTableName: login_history
baseColumnNames: session_id
referencedTableName: core_session
referencedColumnNames: id
constraintName: fk_login_history_session_id
onDelete: SET NULL
- changeSet:
id: 294
author: camsaul
comment: Added 0.39.0
changes:
- createIndex:
tableName: login_history
indexName: idx_session_id
columns:
- column:
name: session_id
# index on login history timestamp -- so admin can see *all* recent logins, or we can delete login history after a certain age
- changeSet:
id: 295
author: camsaul
comment: Added 0.39.0
changes:
- createIndex:
tableName: login_history
indexName: idx_timestamp
columns:
- column:
name: timestamp
# index on login history user_id + device_id -- so we can easily see if this is the first time a device is used
- changeSet:
id: 296
author: camsaul
comment: Added 0.39.0
changes:
- createIndex:
tableName: login_history
indexName: idx_user_id_device_id
columns:
- column:
name: session_id
- column:
name: device_id
# index on login history user_id + timestamp -- so we can easily see recent logins for a user
- changeSet:
id: 297
author: camsaul
comment: Added 0.39.0
changes:
- createIndex:
tableName: login_history
indexName: idx_user_id_timestamp
columns:
- column:
name: user_id
- column:
name: timestamp
# Add parameter columns to pulses so that dashboard subscriptions can have their own filters
- changeSet:
id: 298
author: tsmacdonald
comment: Added 0.39.0
changes:
- addColumn:
tableName: pulse
columns:
- column:
name: parameters
type: text
remarks: "Let dashboard subscriptions have their own filters"
constraints:
nullable: true
deferrable: false
initiallyDeferred: false
- changeSet:
id: 299
author: tsmacdonald
comment: Added 0.39.0
changes:
- addNotNullConstraint:
columnDataType: text
columnName: parameters
defaultNullValue: '[]'
tableName: pulse
- changeSet:
id: 300
author: dpsutton
comment: Added 0.40.0
changes:
- renameTable:
oldTableName: collection_revision
newTableName: collection_permission_graph_revision
- changeSet:
id: 301
author: dpsutton
comment: Added 0.40.0 renaming collection_revision to collection_permission_graph_revision
failOnError: false # mysql and h2 don't have this sequence
preConditions:
- onFail: MARK_RAN
- dbms:
type: postgresql
changes:
- sql:
- sql: ALTER SEQUENCE collection_revision_id_seq RENAME TO collection_permission_graph_revision_id_seq
- changeSet:
id: 303
author: tsmacdonald
comment: Added 0.40.0
changes:
- createTable:
tableName: moderation_review
remarks: "Reviews (from moderators) for a given question/dashboard (BUCM)"
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: updated_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
remarks: "most recent modification time"
constraints:
nullable: false
- column:
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
remarks: "creation time"
constraints:
nullable: false
- column:
name: status
type: varchar(255)
remarks: "verified, misleading, confusing, not_misleading, pending"
- column:
name: text
type: text
remarks: "Explanation of the review"
# I don't think it needs to be non-nullable
- column:
name: moderated_item_id
type: int
remarks: "either a document or question ID; the item that needs review"
constraints:
nullable: false
- column:
name: moderated_item_type
type: varchar(255)
remarks: "whether it's a question or dashboard"
constraints:
nullable: false
- column:
name: moderator_id
type: int
remarks: "ID of the user who did the review"
constraints:
nullable: false
- column:
name: most_recent
type: boolean
remarks: "tag for most recent review"
constraints:
nullable: false
- changeSet:
id: 304
author: camsaul
comment: Added 0.40.0 (replaces a data migration dating back to 0.20.0)
changes:
- sql:
sql: >-
UPDATE metabase_field
SET semantic_type = (CASE semantic_type
WHEN 'avatar' THEN 'type/AvatarURL'
WHEN 'category' THEN 'type/Category'
WHEN 'city' THEN 'type/City'
WHEN 'country' THEN 'type/Country'
WHEN 'desc' THEN 'type/Description'
WHEN 'fk' THEN 'type/FK'
WHEN 'id' THEN 'type/PK'
WHEN 'image' THEN 'type/ImageURL'
WHEN 'json' THEN 'type/SerializedJSON'
WHEN 'latitude' THEN 'type/Latitude'
WHEN 'longitude' THEN 'type/Longitude'
WHEN 'name' THEN 'type/Name'
WHEN 'number' THEN 'type/Number'
WHEN 'state' THEN 'type/State'
WHEN 'url' THEN 'type/URL'
WHEN 'zip_code' THEN 'type/ZipCode'
END)
WHERE semantic_type IN ('avatar', 'category', 'city', 'country', 'desc', 'fk', 'id', 'image',
'json', 'latitude', 'longitude', 'name', 'number', 'state', 'url',
'zip_code');
- changeSet:
id: 305
author: camsaul
comment: Added 0.40.0 (replaces a data migration dating back to 0.20.0)
changes:
- sql:
sql: >-
UPDATE metabase_field
SET base_type = (CASE base_type
WHEN 'ArrayField' THEN 'type/Array'
WHEN 'BigIntegerField' THEN 'type/BigInteger'
WHEN 'BooleanField' THEN 'type/Boolean'
WHEN 'CharField' THEN 'type/Text'
WHEN 'DateField' THEN 'type/Date'
WHEN 'DateTimeField' THEN 'type/DateTime'
WHEN 'DecimalField' THEN 'type/Decimal'
WHEN 'DictionaryField' THEN 'type/Dictionary'
WHEN 'FloatField' THEN 'type/Float'
WHEN 'IntegerField' THEN 'type/Integer'
WHEN 'TextField' THEN 'type/Text'
WHEN 'TimeField' THEN 'type/Time'
WHEN 'UUIDField' THEN 'type/UUID'
WHEN 'UnknownField' THEN 'type/*'
END)
WHERE base_type IN ('ArrayField', 'BigIntegerField', 'BooleanField', 'CharField', 'DateField',
'DateTimeField', 'DecimalField', 'DictionaryField', 'FloatField', 'IntegerField',
'TextField', 'TimeField', 'UUIDField', 'UnknownField');
- changeSet:
id: 308
author: howonlee
comment: Added 0.40.0 Track cache hits in query_execution table
changes:
- addColumn:
tableName: query_execution
columns:
- column:
name: cache_hit
type: boolean
remarks: "Cache hit on query execution"
constraints:
nullable: true
- changeSet:
id: 309
author: dpsutton
comment: 'Added 0.40.0 - Add type to collections'
changes:
- addColumn:
tableName: collection
columns:
- column:
name: authority_level
type: varchar(255)
remarks: 'Nullable column to incidate collection''s authority level. Initially values are "official" and nil.'
constraints:
nullable: true
- changeSet:
id: 311
author: howonlee
comment: Added 0.40.0 Migrate friendly field names, not noop
validCheckSum: ANY # Quoting changes for H2.
changes:
- sql:
dbms: mariadb,mysql
sql: |
UPDATE setting SET value='simple' WHERE `key`='humanization-strategy'
AND value='advanced'
- sql:
dbms: postgresql
sql: |
UPDATE setting SET value='simple' WHERE key='humanization-strategy'
AND value='advanced'
- sql:
dbms: h2
sql: |
UPDATE setting SET "VALUE"='simple' WHERE "KEY"='humanization-strategy'
AND "VALUE"='advanced'
- changeSet:
id: 312
author: noahmoss
comment: Added 0.41.0 Backfill collection_id for dashboard subscriptions
validCheckSum: 8:77ef89ba2e7bc19231d9364492091764
changes:
- sql:
dbms: mariadb,mysql
sql: >-
UPDATE pulse p
INNER JOIN report_dashboard d
ON p.dashboard_id = d.id
SET p.collection_id = d.collection_id;
- sql:
dbms: postgresql
sql: >-
UPDATE pulse p
SET collection_id = d.collection_id
FROM report_dashboard d
WHERE p.dashboard_id = d.id
AND p.dashboard_id IS NOT NULL;
- sql:
dbms: h2
sql: >-
UPDATE pulse p
SET collection_id = (
SELECT d.collection_id
FROM report_dashboard d
WHERE d.id = p.dashboard_id
)
WHERE dashboard_id IS NOT NULL;
- changeSet:
id: 313
author: jeff303
comment: Added 0.42.0 - Secret domain object.
validCheckSum: ANY
changes:
- createTable:
tableName: secret
remarks: Storage for managed secrets (passwords, binary data, etc.)
columns:
- column:
autoIncrement: true
constraints:
nullable: false
primaryKey: true
name: id
remarks: Part of composite primary key for secret; this is the uniquely generted ID column
type: int
- column:
constraints:
nullable: false
primaryKey: true
name: version
defaultValue: 1
remarks: Part of composite primary key for secret; this is the version column
type: int
- column:
constraints:
deferrable: false
foreignKeyName: fk_secret_ref_user_id
initiallyDeferred: false
nullable: true
referencedTableName: core_user
referencedColumnNames: id
name: creator_id
remarks: User ID who created this secret instance
type: int
- column:
constraints:
nullable: false
name: created_at
remarks: Timestamp for when this secret instance was created
type: ${timestamp_type}
- column:
constraints:
nullable: true
name: updated_at
remarks: >-
Timestamp for when this secret record was updated. Only relevant when non-value field changes
since a value change will result in a new version being inserted.
type: ${timestamp_type}
- column:
constraints:
nullable: false
name: name
remarks: The name of this secret record.
type: varchar(254)
- column:
constraints:
# TODO: do we want to constrain this field or leave open for extension? or separate table with FK?
nullable: false
name: kind
remarks: >-
The kind of secret this record represents; the value is interpreted as a Clojure keyword with a
hierarchy. Ex: 'bytes' means generic binary data, 'jks-keystore' extends 'bytes' but has a specific
meaning.
type: varchar(254)
- column:
constraints:
# TODO: similar question to above?
nullable: true
name: source
remarks: >-
The source of secret record, which controls how Metabase interprets the value (ex: 'file-path'
means the 'simple_value' is not the real value, but a pointer to a file that contains the value).
type: varchar(254)
- column:
constraints:
nullable: false
name: value
remarks: The base64 encoded binary value of this secret record. If encryption is enabled, this will
be the output of the encryption procedure on the plaintext. If not, it will be the base64 encoded
plaintext.
type: ${blob.type}
- changeSet:
id: 314
author: howonlee
comment: Added 0.41.0 Fine grained caching controls
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: cache_ttl
type: integer
remarks: "Granular cache TTL for specific database."
constraints:
nullable: true
- changeSet:
id: 315
author: howonlee
comment: Added 0.41.0 Fine grained caching controls, pt 2
changes:
- addColumn:
tableName: report_dashboard
columns:
- column:
name: cache_ttl
type: integer
remarks: "Granular cache TTL for specific dashboard."
constraints:
nullable: true
- changeSet:
id: 316
author: howonlee
comment: Added 0.41.0 Fine grained caching controls, pt 3
changes:
- addColumn:
tableName: view_log
columns:
- column:
name: metadata
type: text
remarks: "Serialized JSON corresponding to metadata for view."
constraints:
nullable: true
- changeSet:
id: 381
author: camsaul
comment: Added 0.41.2 Add index to QueryExecution card_id to fix performance issues (#18759)
changes:
- createIndex:
tableName: query_execution
indexName: idx_query_execution_card_id
columns:
- column:
name: card_id
- changeSet:
id: 382
author: camsaul
comment: Added 0.41.2 Add index to ModerationReview moderated_item_type + moderated_item_id to fix performance issues (#18759)
changes:
- createIndex:
tableName: moderation_review
indexName: idx_moderation_review_item_type_item_id
columns:
- column:
name: moderated_item_type
- column:
name: moderated_item_id
- changeSet:
id: 383
author: camsaul
comment: Added 0.41.3 -- Add index to QueryExecution card_id + started_at to fix performance issue #19053
changes:
- createIndex:
tableName: query_execution
indexName: idx_query_execution_card_id_started_at
columns:
- column:
name: card_id
- column:
name: started_at
- changeSet:
id: v42.00-000
author: camsaul
comment: Added 0.42.0 Remove unused column (#5240)
# this migration was previously numbered 317 and merged into master before we adopted the 0.42.0+ migration ID
# numbering scheme. See #18821 for more info.
preConditions:
- onFail: MARK_RAN
- or:
# For some insane reason databasechangelog is upper-case in MySQL and MariaDB.
- and:
- dbms:
type: postgresql,h2
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM databasechangelog WHERE id = '317';
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM `DATABASECHANGELOG` WHERE id = '317';
changes:
- dropColumn:
tableName: metabase_table
columnName: entity_name
- changeSet:
id: v42.00-001
author: camsaul
comment: Added 0.42.0 Attempt to add Card.database_id (by parsing query) to rows that are missing it (#5999)
validCheckSum: 8:9952153cbff16147bcb47b4a26e02089
# If this migration fails for any reason continue with the next migration; do not fail the entire process if this one fails
failOnError: false
# Don't run for H2 -- the version of H2 we're using doesn't support JSON stuff.
preConditions:
- onFail: MARK_RAN
- dbms:
type: postgresql,mysql,mariadb
# The basic idea below is to parse the `database_id` from the JSON string query dictionary and use it to set the
# database_id column as needed. We do an INNER JOIN against the Database table to make sure that Database
# actually exists (so we don't attempt to set an invalid database_id)
changes:
- sql:
dbms: postgresql
sql: >-
WITH c2 AS (
SELECT *, (dataset_query::json->>'database')::integer AS query_database_id
FROM report_card
)
UPDATE report_card c
SET database_id = c2.query_database_id
FROM c2
INNER JOIN metabase_database db
ON db.id = c2.query_database_id
WHERE c.database_id IS NULL
AND c.id = c2.id
AND c2.query_database_id IS NOT NULL;
# MySQL and MariaDB are exactly the same other than different function names: json_value (for MariaDB) vs
# json_extract (for MySQL)
- sql:
dbms: mariadb
sql: >-
UPDATE report_card c
JOIN (
SELECT *, cast(json_value(dataset_query, '$.database') AS signed) AS query_database_id
FROM report_card
) c2
ON c.id = c2.id
INNER JOIN metabase_database db ON c2.query_database_id = db.id
SET c.database_id = c2.query_database_id
WHERE c.database_id IS NULL
AND c2.query_database_id IS NOT NULL;
- sql:
dbms: mysql
sql: >-
UPDATE report_card c
JOIN (
SELECT *, cast(json_extract(dataset_query, '$.database') AS signed) AS query_database_id
FROM report_card
) c2
ON c.id = c2.id
INNER JOIN metabase_database db ON c2.query_database_id = db.id
SET c.database_id = c2.query_database_id
WHERE c.database_id IS NULL
AND c2.query_database_id IS NOT NULL;
- changeSet:
id: v42.00-002
author: camsaul
comment: Added 0.42.0 Added constraint we should have had all along (#5999)
preConditions:
- onFail: MARK_RAN
# If we're dumping the migration as a SQL file or trying to force-migrate we can't check the preconditions
# so just go ahead and skip the entire thing. This is a non-critical migration
- onUpdateSQL: IGNORE
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM report_card WHERE database_id IS NULL
changes:
- addNotNullConstraint:
columnDataType: int
tableName: report_card
columnName: database_id
- changeSet:
id: v42.00-003
author: dpsutton
comment: Added 0.42.0 Initial support for datasets based on questions
# this migration was previously numbered 320 and merged into master before we adopted the 0.42.0+ migration ID
# numbering scheme. See #18821 for more info.
preConditions:
- onFail: MARK_RAN
- or:
- and:
- dbms:
type: postgresql,h2
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM databasechangelog WHERE id = '320';
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM `DATABASECHANGELOG` WHERE id = '320';
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: dataset
type: boolean
remarks: "Indicate whether question is a dataset"
constraints:
nullable: false
defaultValue: false
- changeSet: # this one is run unconditionally so unify the type to ${text.type} across ALL dbs
id: v42.00-004 # this differentiation was first done under changeSet 13 above
author: jeff303
comment: >-
Added 0.42.0 - modify type of activity.details from text to ${text.type}
changes:
- modifyDataType:
tableName: activity
columnName: details
newDataType: ${text.type}
- changeSet:
id: v42.00-005
author: jeff303
comment: >-
Added 0.42.0 - modify type of collection.description from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: collection
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-006
author: jeff303
comment: >-
Added 0.42.0 - modify type of collection.name from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: collection
columnName: name
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-007
author: jeff303
comment: >-
Added 0.42.0 - modify type of computation_job.context from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: computation_job
columnName: context
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-008
author: jeff303
comment: >-
Added 0.42.0 - modify type of computation_job_result.payload from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: computation_job_result
columnName: payload
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-009
author: jeff303
comment: >-
Added 0.42.0 - modify type of core_session.anti_csrf_token from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: core_session
columnName: anti_csrf_token
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-010
author: jeff303
comment: >-
Added 0.42.0 - modify type of core_user.login_attributes from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: core_user
columnName: login_attributes
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-011
author: jeff303
comment: >-
Added 0.42.0 - modify type of group_table_access_policy.attribute_remappings
from text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: group_table_access_policy
columnName: attribute_remappings
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-012
author: jeff303
comment: >-
Added 0.42.0 - modify type of login_history.device_description from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: login_history
columnName: device_description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-013
author: jeff303
comment: >-
Added 0.42.0 - modify type of login_history.ip_address from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: login_history
columnName: ip_address
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-014
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_database.caveats from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_database
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-015
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_database.description from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_database
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-016
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_database.details from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_database
columnName: details
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-017
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_database.options from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_database
columnName: options
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-018
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_database.points_of_interest from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_database
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-019
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.caveats from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-020
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.database_type from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: database_type
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-021
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.description from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-022
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.fingerprint from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: fingerprint
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-023
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.has_field_values from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: has_field_values
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-024
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.points_of_interest from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-025
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_field.settings from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_field
columnName: settings
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-026
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_fieldvalues.human_readable_values
from text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_fieldvalues
columnName: human_readable_values
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-027
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_fieldvalues.values from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_fieldvalues
columnName: values
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-028
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_table.caveats from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_table
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-029
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_table.description from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_table
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-030
author: jeff303
comment: >-
Added 0.42.0 - modify type of metabase_table.points_of_interest from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metabase_table
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-031
author: jeff303
comment: >-
Added 0.42.0 - modify type of metric.caveats from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metric
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-032
author: jeff303
comment: >-
Added 0.42.0 - modify type of metric.definition from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metric
columnName: definition
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-033
author: jeff303
comment: >-
Added 0.42.0 - modify type of metric.description from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: metric
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-034
author: jeff303
comment: >-
Added 0.42.0 - modify type of metric.how_is_this_calculated from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metric
columnName: how_is_this_calculated
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-035
author: jeff303
comment: >-
Added 0.42.0 - modify type of metric.points_of_interest from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: metric
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-036
author: jeff303
comment: >-
Added 0.42.0 - modify type of moderation_review.text from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: moderation_review
columnName: text
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-037
author: jeff303
comment: >-
Added 0.42.0 - modify type of native_query_snippet.content from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: native_query_snippet
columnName: content
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-038
author: jeff303
comment: >-
Added 0.42.0 - modify type of native_query_snippet.description from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: native_query_snippet
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-039
author: jeff303
comment: >-
Added 0.42.0 - modify type of pulse.parameters from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: pulse
columnName: parameters
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-040
author: jeff303
comment: >-
Added 0.42.0 - modify type of pulse_channel.details from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: pulse_channel
columnName: details
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-041
author: jeff303
comment: >-
Added 0.42.0 - modify type of query.query from text to ${text.type} on
mysql,mariadb
changes:
- modifyDataType:
tableName: query
columnName: query
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-042
author: jeff303
comment: >-
Added 0.42.0 - modify type of query_execution.error from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: query_execution
columnName: error
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-043
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_card.dataset_query from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_card
columnName: dataset_query
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-044
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_card.description from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: report_card
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-045
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_card.embedding_params from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_card
columnName: embedding_params
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-046
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_card.result_metadata from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_card
columnName: result_metadata
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-047
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_card.visualization_settings from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_card
columnName: visualization_settings
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-048
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboard.caveats from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboard
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-049
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboard.description from text
to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboard
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-050
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboard.embedding_params from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboard
columnName: embedding_params
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-051
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboard.parameters from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboard
columnName: parameters
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-052
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboard.points_of_interest from
text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboard
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-053
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboardcard.parameter_mappings
from text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboardcard
columnName: parameter_mappings
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-054
author: jeff303
comment: >-
Added 0.42.0 - modify type of report_dashboardcard.visualization_settings
from text to ${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: report_dashboardcard
columnName: visualization_settings
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-055
author: jeff303
comment: >-
Added 0.42.0 - modify type of revision.message from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: revision
columnName: message
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet: # this one is run unconditionally so unify the type to ${text.type} across ALL dbs
id: v42.00-056 # this differentiation was first done under changeSet 10 above
author: jeff303
comment: >-
Added 0.42.0 - modify type of revision.object from text to ${text.type}
changes:
- modifyDataType:
tableName: revision
columnName: object
newDataType: ${text.type}
- changeSet:
id: v42.00-057
author: jeff303
comment: >-
Added 0.42.0 - modify type of segment.caveats from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: segment
columnName: caveats
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-058
author: jeff303
comment: >-
Added 0.42.0 - modify type of segment.definition from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: segment
columnName: definition
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-059
author: jeff303
comment: >-
Added 0.42.0 - modify type of segment.description from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: segment
columnName: description
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-060
author: jeff303
comment: >-
Added 0.42.0 - modify type of segment.points_of_interest from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: segment
columnName: points_of_interest
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-061
author: jeff303
comment: >-
Added 0.42.0 - modify type of setting.value from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: setting
columnName: value
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-062
author: jeff303
comment: >-
Added 0.42.0 - modify type of task_history.task_details from text to
${text.type} on mysql,mariadb
changes:
- modifyDataType:
tableName: task_history
columnName: task_details
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-063
author: jeff303
comment: >-
Added 0.42.0 - modify type of view_log.metadata from text to ${text.type}
on mysql,mariadb
changes:
- modifyDataType:
tableName: view_log
columnName: metadata
newDataType: ${text.type}
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
- changeSet:
id: v42.00-064
author: jeff303
comment: "Added 0.42.0 - fix type of query_cache.results on upgrade (in case changeSet 97 was run before #16095)"
preConditions:
- onFail: MARK_RAN
- dbms:
type: mysql,mariadb
changes:
- modifyDataType:
tableName: query_cache
columnName: results
newDataType: longblob
- changeSet:
id: v42.00-065
author: dpsutton
comment: >-
Added 0.42.0 - Another modal dismissed state on user. Retaining the same suffix and boolean style to ease an
eventual migration.
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: is_datasetnewb
type: boolean
remarks: "Boolean flag to indicate if the dataset info modal has been dismissed."
defaultValueBoolean: true
constraints:
nullable: false
- changeSet:
id: v42.00-066
author: noahmoss
comment: >-
Added 0.42.0 - new columns for initial DB sync progress UX. Indicates whether a database has succesfully synced
at least one time.
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: initial_sync_status
type: varchar(32)
remarks: "String indicating whether a database has completed its initial sync and is ready to use"
defaultValue: "complete"
constraints:
nullable: false
- changeSet:
id: v42.00-067
author: noahmoss
comment: >-
Added 0.42.0 - new columns for initial DB sync progress UX. Indicates whether a table has succesfully synced
at least one time.
changes:
- addColumn:
tableName: metabase_table
columns:
- column:
name: initial_sync_status
type: varchar(32)
remarks: "String indicating whether a table has completed its initial sync and is ready to use"
defaultValue: "complete"
constraints:
nullable: false
- changeSet:
id: v42.00-068
author: noahmoss
comment: >-
Added 0.42.0 - new columns for initial DB sync progress UX. Records the ID of the admin who added a database.
May be null for the sample dataset, or for databases added prior to 0.42.0.
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: creator_id
type: int
remarks: "ID of the admin who added the database"
constraints:
nullable: true
- changeSet:
id: v42.00-069
author: noahmoss
comment: >-
Added 0.42.0 - adds FK constraint for creator_id column, containing the ID of the admin who added a database.
changes:
- addForeignKeyConstraint:
baseTableName: metabase_database
baseColumnNames: creator_id
referencedTableName: core_user
referencedColumnNames: id
constraintName: fk_database_creator_id
onDelete: SET NULL
- changeSet:
id: v42.00-070
author: camsaul
comment: >-
Added 0.42.0 - add Database.settings column to implement Database-local Settings
# This migration was originally misnumbered, so now that it has a correct number it may get triggered a second
# time. That's fine
preConditions:
- onFail: MARK_RAN
- not:
- columnExists:
tableName: metabase_database
columnName: settings
changes:
- addColumn:
tableName: metabase_database
columns:
- column:
name: settings
type: ${text.type}
remarks: "Serialized JSON containing Database-local Settings for this Database"
- changeSet:
id: v42.00-071
author: noahmoss
comment: >-
Added 0.42.0 - migrates the Sample Dataset to the name "Sample Database"
changes:
- sql:
sql: UPDATE metabase_database SET name='Sample Database' WHERE is_sample=true
- changeSet:
id: v43.00-001
author: jeff303
comment: >-
Added 0.43.0 - migrates any Database using the old bigquery driver to bigquery-cloud-sdk instead
changes:
- sql:
sql: UPDATE metabase_database SET engine = 'bigquery-cloud-sdk' WHERE engine = 'bigquery'
#
# The next few migrations replace metabase.app-db.data-migrations/add-users-to-default-permissions-groups from 0.20.0
#
# Create the magic Permissions Groups if they don't already exist.
# [add-users-to-default-permissions-groups 1 of 4]
- changeSet:
id: v43.00-002
author: camsaul
comment: >-
Added 0.43.0. Create magic 'All Users' Permissions Group if it does not already exist.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*) FROM permissions_group WHERE name = 'All Users';
changes:
- sql:
sql: >-
INSERT INTO permissions_group (name)
VALUES
('All Users')
# [add-users-to-default-permissions-groups 2 of 4]
- changeSet:
id: v43.00-003
author: camsaul
comment: >-
Added 0.43.0. Create magic 'Administrators' Permissions Group if it does not already exist.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*) FROM permissions_group WHERE name = 'Administrators';
changes:
- sql:
sql: >-
INSERT INTO permissions_group (name)
VALUES
('Administrators')
# Add existing Users to the magic Permissions Groups if needed.
# [add-users-to-default-permissions-groups 3 of 4]
- changeSet:
id: v43.00-004
author: camsaul
comment: >-
Added 0.43.0. Add existing Users to 'All Users' magic Permissions Group if needed.
changes:
- sql:
sql: >-
INSERT INTO permissions_group_membership (user_id, group_id)
SELECT
u.id AS user_id,
all_users_group.id AS group_id
FROM core_user u
LEFT JOIN (
SELECT *
FROM permissions_group
WHERE name = 'All Users'
) all_users_group
ON true
LEFT JOIN permissions_group_membership pgm
ON u.id = pgm.user_id
AND all_users_group.id = pgm.group_id
WHERE pgm.id IS NULL;
# [add-users-to-default-permissions-groups 4 of 4]
- changeSet:
id: v43.00-005
author: camsaul
comment: >-
Added 0.43.0. Add existing Users with 'is_superuser' flag to 'Administrators' magic Permissions Group if needed.
changes:
- sql:
sql: >-
INSERT INTO permissions_group_membership (user_id, group_id)
SELECT
u.id AS user_id,
admin_group.id AS group_id
FROM core_user u
LEFT JOIN (
SELECT *
FROM permissions_group
WHERE name = 'Administrators'
) admin_group
ON true
LEFT JOIN permissions_group_membership pgm
ON u.id = pgm.user_id
AND admin_group.id = pgm.group_id
WHERE u.is_superuser = true
AND pgm.id IS NULL;
#
# This migration replaces metabase.app-db.data-migrations/add-admin-group-root-entry, added 0.20.0
#
# Create root permissions entry for admin magic Permissions Group. Admin Group has a single entry that lets it
# access to everything
- changeSet:
id: v43.00-006
author: camsaul
comment: >-
Added 0.43.0. Create root '/' permissions entry for the 'Administrators' magic Permissions Group if needed.
changes:
- sql:
sql: >-
INSERT INTO permissions (group_id, object)
SELECT
admin_group.id AS group_id,
'/' AS object
FROM (
SELECT id
FROM permissions_group
WHERE name = 'Administrators'
) admin_group
LEFT JOIN permissions p
ON admin_group.id = p.group_id
AND p.object = '/'
WHERE p.object IS NULL;
#
# The following migration replaces metabase.app-db.data-migrations/add-databases-to-magic-permissions-groups, added 0.20.0
#
# Add permissions entries for 'All Users' for all Databases created BEFORE we created the 'All Users' Permissions
# Group. This replaces the old 'add-databases-to-magic-permissions-groups' Clojure-land data migration. Only run
# this migration if that one hasn't been run yet.
- changeSet:
id: v43.00-007
author: camsaul
comment: >-
Added 0.43.0. Grant permissions for existing Databases to 'All Users' permissions group.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-databases-to-magic-permissions-groups';
changes:
- sql:
sql: >-
INSERT INTO permissions (object, group_id)
SELECT db.object, all_users.id AS group_id
FROM (
SELECT concat('/db/', id, '/') AS object
FROM metabase_database
) db
LEFT JOIN (
SELECT id
FROM permissions_group
WHERE name = 'All Users'
) all_users
ON true
LEFT JOIN permissions p
ON p.group_id = all_users.id
AND db.object = p.object
WHERE p.object IS NULL;
#
# The following migration replaces metabase.app-db.migrations/copy-site-url-setting-and-remove-trailing-slashes, added 0.23.0
#
# Copy the value of the old setting `-site-url` to the new `site-url` if applicable. (`site-url` used to be stored
# internally as `-site-url`; this was confusing, see #4188 for details.) Make sure `site-url` has no trailing slashes
# originally fixed in #4123.
- changeSet:
id: v43.00-008
author: camsaul
comment: >-
Added 0.43.0. Migrate legacy '-site-url' Setting to 'site-url'. Trim trailing slashes.
validCheckSum: ANY # Quoting changes in H2 don't need to be re-run
preConditions:
- onFail: MARK_RAN
- or:
- and:
- dbms:
type: postgresql
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE key = 'site-url';
- and:
- dbms:
type: h2
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE "KEY" = 'site-url';
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE `key` = 'site-url';
changes:
- sql:
dbms: h2
sql: >-
INSERT INTO setting ("KEY", "VALUE")
SELECT
'site-url' AS "KEY",
regexp_replace("VALUE", '/$', '') AS "VALUE"
FROM setting
WHERE "KEY" = '-site-url';
- sql:
dbms: postgresql
sql: >-
INSERT INTO setting (key, value)
SELECT
'site-url' AS key,
regexp_replace(value, '/$', '') AS value
FROM setting
WHERE key = '-site-url';
- sql:
dbms: mysql,mariadb
# MySQL 5.7 doesn't support regexp_replace :(
# 'key' has to be quoted in MySQL
sql: >-
INSERT INTO setting (`key`, value)
SELECT
'site-url' AS `key`,
CASE
WHEN value LIKE '%/'
THEN substring(value, 1, length(value) - 1)
ELSE
value
END
AS value
FROM setting
WHERE `key` = '-site-url';
#
# The following migration replaces metabase.app-db.migrations/ensure-protocol-specified-in-site-url, added in 0.25.1
#
# There's a window on in the 0.23.0 and 0.23.1 releases that the site-url could be persisted without a protocol
# specified. Other areas of the application expect that site-url will always include http/https. This migration
# ensures that if we have a site-url stored it has the current defaulting logic applied to it
- changeSet:
id: v43.00-009
author: camsaul
comment: >-
Added 0.43.0. Make sure 'site-url' Setting includes protocol.
validCheckSum: ANY # Quoting changes in H2 don't need to be re-run
changes:
- sql:
dbms: postgresql
sql: >-
UPDATE setting
SET value = concat('http://', value)
WHERE key = 'site-url'
AND value NOT LIKE 'http%';
- sql:
dbms: h2
sql: >-
UPDATE setting
SET "VALUE" = concat('http://', "VALUE")
WHERE "KEY" = 'site-url'
AND "VALUE" NOT LIKE 'http%';
- sql:
dbms: mysql,mariadb
sql: >-
UPDATE setting
SET value = concat('http://', value)
WHERE `key` = 'site-url'
AND value NOT LIKE 'http%';
#
# The following migrations replace metabase.app-db.migrations/migrate-humanization-setting, added in 0.28.0
#
# Prior to version 0.28.0 humanization was configured using the boolean setting `enable-advanced-humanization`.
# `true` meant "use advanced humanization", while `false` meant "use simple humanization". In 0.28.0, this Setting
# was replaced by the `humanization-strategy` Setting, which (at the time of this writing) allows for a choice
# between three options: advanced, simple, or none. Migrate any values of the old Setting, if set, to the new one.
# [migrate-humanization-setting part 1 of 2]
- changeSet:
id: v43.00-010
author: camsaul
comment: >-
Added 0.43.0. Migrates value of legacy enable-advanced-humanization Setting to humanization-strategy Setting added in 0.28.0.
validCheckSum: ANY # Quoting changes in H2 don't need to be re-run
preConditions:
- onFail: MARK_RAN
- or:
- and:
- dbms:
type: postgresql
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE key = 'humanization-strategy';
- and:
- dbms:
type: h2
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE "KEY" = 'humanization-strategy';
- and:
- dbms:
type: mysql,mariadb
- sqlCheck:
expectedResult: 0
sql: SELECT count(*) FROM setting WHERE `key` = 'humanization-strategy';
changes:
- sql:
dbms: postgresql
sql: >-
INSERT INTO setting (key, value)
SELECT
'humanization-strategy' AS key,
(CASE WHEN value = 'true' THEN 'advanced' ELSE 'simple' END) AS value
FROM setting
WHERE key = 'enable-advanced-humanization';
# key and value have to be quoted in H2
- sql:
dbms: h2
sql: >-
INSERT INTO setting ("KEY", "VALUE")
SELECT
'humanization-strategy' AS "KEY",
(CASE WHEN "VALUE" = 'true' THEN 'advanced' ELSE 'simple' END) AS "VALUE"
FROM setting
WHERE "KEY" = 'enable-advanced-humanization';
# key has to be quoted in MySQL/MariaDB
- sql:
dbms: mysql,mariadb
sql: >-
INSERT INTO setting (`key`, value)
SELECT
'humanization-strategy' AS `key`,
(CASE WHEN value = 'true' THEN 'advanced' ELSE 'simple' END) AS value
FROM setting
WHERE `key` = 'enable-advanced-humanization';
# [migrate-humanization-setting part 2 of 2]
- changeSet:
id: v43.00-011
author: camsaul
comment: >-
Added 0.43.0. Remove legacy enable-advanced-humanization Setting.
validCheckSum: ANY # Quoting changes in H2 don't need to be re-run
changes:
- sql:
dbms: postgresql
sql: >-
DELETE FROM setting WHERE key = 'enable-advanced-humanization';
# key has to be quoted in H2
- sql:
dbms: h2
sql: >-
DELETE FROM setting WHERE "KEY" = 'enable-advanced-humanization';
# key has to be quoted in MySQL/MariaDB
- sql:
dbms: mysql,mariadb
sql: >-
DELETE FROM setting WHERE `key` = 'enable-advanced-humanization';
#
# The following migration replaces metabase.app-db.migrations/mark-category-fields-as-list, added in 0.29.0
#
# Starting in version 0.29.0 we switched the way we decide which Fields should get FieldValues. Prior to 29, Fields
# would be marked as special type Category if they should have FieldValues. In 29+, the Category special type no
# longer has any meaning as far as the backend is concerned. Instead, we use the new `has_field_values` column to
# keep track of these things. Fields whose value for `has_field_values` is `list` is the equiavalent of the old
# meaning of the Category special type.
#
# Note that in 0.39.0 special type was renamed to semantic type
- changeSet:
id: v43.00-012
author: camsaul
comment: >-
Added 0.43.0. Set Field.has_field_values to 'list' if semantic_type derives from :type/Category.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'mark-category-fields-as-list';
changes:
- sql:
# This is a snapshot of all the descendants of `:type/Category` at the time this migration was written. We
# don't need to worry about new types being added in the future, since the purpose of this migration is
# only to update old columns.
sql: >-
UPDATE metabase_field
SET has_field_values = 'list'
WHERE has_field_values IS NULL
AND active = true
AND semantic_type IN (
'type/Category',
'type/City',
'type/Company',
'type/Country',
'type/Name',
'type/Product',
'type/Source',
'type/State',
'type/Subscription',
'type/Title'
);
#
# The following migrations replace metabase.app-db.migrations/add-migrated-collections, added in 0.30.0
#
# In 0.30 dashboards and pulses will be saved in collections rather than on separate list pages. Additionally, there
# will no longer be any notion of saved questions existing outside of a collection (i.e. in the weird "Everything
# Else" area where they can currently be saved).
#
# Consequently we'll need to move existing dashboards, pulses, and questions-not-in-a-collection to a new location
# when users upgrade their instance to 0.30 from a previous version.
#
# The user feedback we've received points to a UX that would do the following:
#
# 1. Set permissions to the Root Collection to readwrite perms access for *all* Groups.
#
# 2. Create three new collections within the root collection: "Migrated dashboards," "Migrated pulses," and "Migrated
# questions."
#
# 3. The permissions settings for these new collections should be set to No Access for all user groups except
# Administrators.
#
# 4. Existing Dashboards, Pulses, and Questions from the "Everything Else" area should now be present within these
# new collections.
# [add-migrated-collections part 1 of 7] Create 'Migrated Dashboards' Collection if needed
- changeSet:
id: v43.00-014
author: camsaul
comment: >-
Added 0.43.0. Add 'Migrated Dashboards' Collection if needed and there are any Dashboards not in a Collection.
preConditions:
- onFail: MARK_RAN
- and:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM collection
WHERE name = 'Migrated Dashboards';
- not:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM report_dashboard
WHERE collection_id IS NULL;
changes:
- sql:
# #509ee3 is the MB brand color
sql: >-
INSERT INTO collection (name, color, slug)
VALUES
('Migrated Dashboards', '#509ee3', 'migrated_dashboards');
# [add-migrated-collections part 2 of 7] Create 'Migrated Pulses' Collection if needed
- changeSet:
id: v43.00-015
author: camsaul
comment: >-
Added 0.43.0. Add 'Migrated Pulses' Collection if needed and there are any Pulses not in a Collection.
preConditions:
- onFail: MARK_RAN
- and:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM collection
WHERE name = 'Migrated Pulses';
- not:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM pulse
WHERE collection_id IS NULL;
changes:
- sql:
# #509ee3 is the MB brand color
sql: >-
INSERT INTO collection (name, color, slug)
VALUES
('Migrated Pulses', '#509ee3', 'migrated_pulses');
# [add-migrated-collections part 3 of 7] Create 'Migrated Questions' Collection if needed
- changeSet:
id: v43.00-016
author: camsaul
comment: >-
Added 0.43.0. Add 'Migrated Questions' Collection if needed and there are any Cards not in a Collection.
preConditions:
- onFail: MARK_RAN
- and:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM collection
WHERE name = 'Migrated Questions';
- not:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM report_card
WHERE collection_id IS NULL;
changes:
- sql:
# #509ee3 is the MB brand color
sql: >-
INSERT INTO collection (name, color, slug)
VALUES
('Migrated Questions', '#509ee3', 'migrated_questions');
# [add-migrated-collections part 4 of 7] Move Dashboards not in a Collection to 'Migrated Dashboards'
- changeSet:
id: v43.00-017
author: camsaul
comment: >-
Added 0.43.0. Move Dashboards not in a Collection to 'Migrated Dashboards'.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
changes:
- sql:
sql: >-
UPDATE report_dashboard
SET collection_id = (SELECT id FROM collection WHERE name = 'Migrated Dashboards')
WHERE collection_id IS NULL;
# [add-migrated-collections part 5 of 7] Move Pulses not in a Collection to 'Migrated Pulses'
- changeSet:
id: v43.00-018
author: camsaul
comment: >-
Added 0.43.0. Move Pulses not in a Collection to 'Migrated Pulses'.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
changes:
- sql:
sql: >-
UPDATE pulse
SET collection_id = (SELECT id FROM collection WHERE name = 'Migrated Pulses')
WHERE collection_id IS NULL;
# [add-migrated-collections part 6 of 7] Move Cards not in a Collection to 'Migrated Questions'
- changeSet:
id: v43.00-019
author: camsaul
comment: >-
Added 0.43.0. Move Cards not in a Collection to 'Migrated Questions'.
preConditions:
- onFail: MARK_RAN
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
changes:
- sql:
sql: >-
UPDATE report_card
SET collection_id = (SELECT id FROM collection WHERE name = 'Migrated Questions')
WHERE collection_id IS NULL;
# [add-migrated-collections part 7 of 7] Grant All Users readwrite perms for the Root Collection.
- changeSet:
id: v43.00-020
author: camsaul
comment: >-
Added 0.43.0. Grant the 'All Users' Permissions Group readwrite perms for the Root Collection.
preConditions:
- onFail: MARK_RAN
- and:
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*)
FROM data_migrations
WHERE id = 'add-migrated-collections';
changes:
- sql:
sql: >-
INSERT INTO permissions (group_id, object)
SELECT
all_users_group.id AS group_id,
'/collection/root/' AS object
FROM (
SELECT id
FROM permissions_group
WHERE name = 'All Users'
) all_users_group
LEFT JOIN permissions p
ON all_users_group.id = p.group_id
AND p.object = '/collection/root/'
WHERE p.object IS NULL;
- changeSet:
id: v43.00-021
author: adam-james
comment: Added 0.43.0 - Timeline table for Events
changes:
- createTable:
tableName: timeline
remarks: Timeline table to organize events
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
nullable: false
primaryKey: true
- column:
remarks: Name of the timeline
name: name
type: varchar(255)
constraints:
nullable: false
- column:
remarks: Optional description of the timeline
name: description
type: varchar(255)
constraints:
nullable: true
- column:
name: icon
type: varchar(128)
constraints:
nullable: true
remarks: the icon to use when displaying the event
- column:
remarks: ID of the collection containing the timeline
name: collection_id
type: int
constraints:
nullable: true
references: collection(id)
foreignKeyName: fk_timeline_collection_id
deleteCascade: true
- column:
remarks: Whether or not the timeline has been archived
name: archived
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- column:
remarks: ID of the user who created the timeline
name: creator_id
type: int
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_timeline_creator_id
deleteCascade: true
- column:
remarks: The timestamp of when the timeline was created
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- column:
remarks: The timestamp of when the timeline was updated
name: updated_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- changeSet:
id: v43.00-022
author: adam-james
comment: Added 0.43.0 - Events table
changes:
- createTable:
tableName: timeline_event
remarks: Events table
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
nullable: false
primaryKey: true
- column:
remarks: ID of the timeline containing the event
name: timeline_id
type: int
constraints:
nullable: false
references: timeline(id)
foreignKeyName: fk_events_timeline_id
deleteCascade: true
- column:
remarks: Name of the event
name: name
type: varchar(255)
constraints:
nullable: false
- column:
remarks: Optional markdown description of the event
name: description
type: varchar(255)
constraints:
nullable: true
- column:
name: timestamp
type: ${timestamp_type}
constraints:
nullable: false
remarks: When the event happened
- column:
name: time_matters
type: boolean
constraints:
nullable: false
remarks: >-
Indicate whether the time component matters or if the timestamp should just serve to indicate the
day of the event without any time associated to it.
- column:
name: timezone
constraints:
nullable: false
type: varchar(255)
remarks: Timezone to display the underlying UTC timestamp in for the client
- column:
name: icon
type: varchar(128)
constraints:
nullable: true
remarks: the icon to use when displaying the event
- column:
remarks: Whether or not the event has been archived
name: archived
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- column:
remarks: ID of the user who created the event
name: creator_id
type: int
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_event_creator_id
deleteCascade: true
- column:
remarks: The timestamp of when the event was created
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- column:
remarks: The timestamp of when the event was modified
name: updated_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- changeSet:
id: v43.00-023
author: dpsutton
comment: Added 0.43.0 - Index on timeline collection_id
changes:
- createIndex:
tableName: timeline
indexName: idx_timeline_collection_id
columns:
- column:
name: collection_id
- changeSet:
id: v43.00-024
author: dpsutton
comment: Added 0.43.0 - Index on timeline_event timeline_id
changes:
- createIndex:
tableName: timeline_event
indexName: idx_timeline_event_timeline_id
columns:
- column:
name: timeline_id
- changeSet:
id: v43.00-025
author: dpsutton
comment: Added 0.43.0 - Index on timeline timestamp
changes:
- createIndex:
tableName: timeline_event
indexName: idx_timeline_event_timeline_id_timestamp
columns:
- column:
name: timeline_id
- column:
name: timestamp
- changeSet:
id: v43.00-026
author: noahmoss
comment: >-
Added 0.43.0 - adds User.settings column to implement User-local Settings
changes:
- addColumn:
tableName: core_user
columns:
- column:
name: settings
type: ${text.type}
remarks: "Serialized JSON containing User-local Settings for this User"
- changeSet:
id: v43.00-027
author: camsaul
comment: Added 0.43.0. Drop NOT NULL constraint for core_user.password
changes:
- dropNotNullConstraint:
tableName: core_user
columnName: password
columnDataType: varchar(254)
- changeSet:
id: v43.00-028
author: camsaul
comment: Added 0.43.0. Drop NOT NULL constraint for core_user.password_salt
changes:
- dropNotNullConstraint:
tableName: core_user
columnName: password_salt
columnDataType: varchar(254)
#
# The following migration replaces metabase.app-db.data-migrations/clear-ldap-user-local-passwords, added 0.30.0
#
# Before 0.30.0, we were storing the LDAP user's password in the core_user table (though it wasn't used). This
# migration clears those passwords out, disabling password-based login.
- changeSet:
id: v43.00-029
author: camsaul
comment: Added 0.43.0. Clear local password for Users using LDAP auth.
changes:
- sql:
sql: >-
UPDATE core_user
SET
password = NULL,
password_salt = NULL
WHERE ldap_auth IS TRUE;
- changeSet:
id: v43.00-030
author: dpsutton
comment: Added 0.43.0 - Dashboard bookmarks table
changes:
- createTable:
tableName: dashboard_bookmark
remarks: Table holding bookmarks on dashboards
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
remarks: 'ID of the User who bookmarked the Dashboard'
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_dashboard_bookmark_user_id
deleteCascade: true
- column:
name: dashboard_id
type: int
remarks: 'ID of the Dashboard bookmarked by the user'
constraints:
nullable: false
references: report_dashboard(id)
foreignKeyName: fk_dashboard_bookmark_dashboard_id
deleteCascade: true
- column:
remarks: The timestamp of when the bookmark was created
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- changeSet:
id: v43.00-031
author: dpsutton
comment: Added 0.43.0 - Dashboard bookmarks table unique constraint
changes:
- addUniqueConstraint:
tableName: dashboard_bookmark
columnNames: user_id, dashboard_id
constraintName: unique_dashboard_bookmark_user_id_dashboard_id
- changeSet:
id: v43.00-032
author: dpsutton
comment: Added 0.43.0 - Dashboard bookmarks table index on user_id
changes:
- createIndex:
tableName: dashboard_bookmark
columns:
- column:
name: user_id
indexName: idx_dashboard_bookmark_user_id
- changeSet:
id: v43.00-033
author: dpsutton
comment: Added 0.43.0 - Dashboard bookmarks table index on dashboard_id
changes:
- createIndex:
tableName: dashboard_bookmark
columns:
- column:
name: dashboard_id
indexName: idx_dashboard_bookmark_dashboard_id
- changeSet:
id: v43.00-034
author: dpsutton
comment: Added 0.43.0 - Card bookmarks table
changes:
- createTable:
tableName: card_bookmark
remarks: Table holding bookmarks on cards
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
remarks: 'ID of the User who bookmarked the Card'
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_card_bookmark_user_id
deleteCascade: true
- column:
name: card_id
type: int
remarks: 'ID of the Card bookmarked by the user'
constraints:
nullable: false
references: report_card(id)
foreignKeyName: fk_card_bookmark_dashboard_id
deleteCascade: true
- column:
remarks: The timestamp of when the bookmark was created
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- changeSet:
id: v43.00-035
author: dpsutton
comment: Added 0.43.0 - Card bookmarks table unique constraint
changes:
- addUniqueConstraint:
tableName: card_bookmark
columnNames: user_id, card_id
constraintName: unique_card_bookmark_user_id_card_id
- changeSet:
id: v43.00-036
author: dpsutton
comment: Added 0.43.0 - Card bookmarks table index on user_id
changes:
- createIndex:
tableName: card_bookmark
columns:
- column:
name: user_id
indexName: idx_card_bookmark_user_id
- changeSet:
id: v43.00-037
author: dpsutton
comment: Added 0.43.0 - Card bookmarks table index on card_id
changes:
- createIndex:
tableName: card_bookmark
columns:
- column:
name: card_id
indexName: idx_card_bookmark_card_id
- changeSet:
id: v43.00-038
author: dpsutton
comment: Added 0.43.0 - Collection bookmarks table
changes:
- createTable:
tableName: collection_bookmark
remarks: Table holding bookmarks on collections
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
remarks: 'ID of the User who bookmarked the Collection'
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_collection_bookmark_user_id
deleteCascade: true
- column:
name: collection_id
type: int
remarks: 'ID of the Card bookmarked by the user'
constraints:
nullable: false
references: collection(id)
foreignKeyName: fk_collection_bookmark_collection_id
deleteCascade: true
- column:
remarks: The timestamp of when the bookmark was created
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- changeSet:
id: v43.00-039
author: dpsutton
comment: Added 0.43.0 - Collection bookmarks table unique constraint
changes:
- addUniqueConstraint:
tableName: collection_bookmark
columnNames: user_id, collection_id
constraintName: unique_collection_bookmark_user_id_collection_id
- changeSet:
id: v43.00-040
author: dpsutton
comment: Added 0.43.0 - Collection bookmarks table index on user_id
changes:
- createIndex:
tableName: collection_bookmark
columns:
- column:
name: user_id
indexName: idx_collection_bookmark_user_id
- changeSet:
id: v43.00-041
author: dpsutton
comment: Added 0.43.0 - Collection bookmarks table index on collection_id
changes:
- createIndex:
tableName: collection_bookmark
columns:
- column:
name: collection_id
indexName: idx_collection_bookmark_collection_id
- changeSet:
id: v43.00-042
author: noahmoss
comment: >-
Added 0.43.0. Grant download permissions for existing Databases to 'All Users' permissions group
changes:
- sql:
sql: >-
INSERT INTO permissions (object, group_id)
SELECT db.object, all_users.id AS group_id
FROM (
SELECT concat('/download/db/', id, '/') AS object
FROM metabase_database
) db
LEFT JOIN (
SELECT id
FROM permissions_group
WHERE name = 'All Users'
) all_users
ON true
LEFT JOIN permissions p
ON p.group_id = all_users.id
AND db.object = p.object
WHERE p.object IS NULL;
- changeSet:
id: v43.00-043
author: howonlee
comment: Added 0.43.0 - Nested field columns in fields
changes:
- addColumn:
columns:
- column:
remarks: Nested field column paths, flattened
name: nfc_path
type: varchar(254)
constraints:
nullable: true
tableName: metabase_field
- changeSet:
id: v43.00-044
author: noahmoss
comment: Added 0.43.0 - Removes MetaBot permissions group
changes:
- sql:
sql: DELETE FROM permissions_group WHERE name = 'MetaBot'
- changeSet:
id: v43.00-046
author: qnkhuat
comment: Added 0.43.0 - create General Permission Revision table
changes:
- createTable:
tableName: general_permissions_revision
remarks: 'Used to keep track of changes made to general permissions.'
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: before
type: ${text.type}
remarks: 'Serialized JSON of the permission graph before the changes.'
constraints:
nullable: false
- column:
name: after
type: ${text.type}
remarks: 'Serialized JSON of the changes in permission graph.'
constraints:
nullable: false
- column:
name: user_id
type: int
remarks: 'The ID of the admin who made this set of changes.'
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_general_permissions_revision_user_id
- column:
name: created_at
type: datetime
remarks: 'The timestamp of when these changes were made.'
constraints:
nullable: false
- column:
name: remark
type: ${text.type}
remarks: 'Optional remarks explaining why these changes were made.'
- changeSet:
id: v43.00-047
author: qnkhuat
comment: Added 0.43.0. Grant the 'All Users' Group permissions to create/edit subscriptions and alerts
changes:
- sql:
sql: >-
INSERT INTO permissions (group_id, object)
SELECT
all_users_group.id AS group_id,
'/general/subscription/' AS object
FROM (
SELECT id
FROM permissions_group
WHERE name = 'All Users'
) all_users_group
LEFT JOIN permissions p
ON all_users_group.id = p.group_id
AND p.object = '/general/subscription/'
WHERE p.object IS NULL;
- changeSet:
id: v43.00-049
author: dpsutton
comment: Added 0.43.0 - Unify datatype with query_execution.started_at so comparable (see 168).
changes:
- modifyDataType:
tableName: view_log
columnName: timestamp
newDataType: ${timestamp_type}
- changeSet:
id: v43.00-050
author: qnkhuat
comment: Added 0.43.0. Add permissions_group_membership.is_group_manager
changes:
- addColumn:
columns:
- column:
remarks: Boolean flag to indicate whether user is a group's manager.
name: is_group_manager
type: boolean
constraints:
nullable: false
defaultValue: false
tableName: permissions_group_membership
- changeSet:
id: v43.00-051
author: adam-james
comment: Added 0.43.0 - default boolean on timelines to indicate default timeline for a collection
changes:
- addColumn:
columns:
- column:
remarks: Boolean value indicating if the timeline is the default one for the containing Collection
name: default
type: boolean
defaultValue: false
constraints:
nullable: false
tableName: timeline
- changeSet:
id: v43.00-052
author: snoe
comment: Added 0.43.0 - bookmark ordering
changes:
- createTable:
tableName: bookmark_ordering
remarks: Table holding ordering information for various bookmark tables
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: user_id
type: int
remarks: 'ID of the User who ordered bookmarks'
constraints:
nullable: false
references: core_user(id)
foreignKeyName: fk_bookmark_ordering_user_id
deleteCascade: true
- column:
name: type
type: varchar(255)
remarks: 'type of the Bookmark'
constraints:
nullable: false
- column:
name: item_id
type: int
remarks: 'id of the item being bookmarked (Card, Collection, Dashboard, ...) no FK, so may no longer exist'
constraints:
nullable: false
- column:
name: ordering
type: int
remarks: 'order of bookmark for user'
constraints:
nullable: false
- changeSet:
id: v43.00-053
author: snoe
comment: Added 0.43.0 - bookmark ordering
changes:
- addUniqueConstraint:
tableName: bookmark_ordering
columnNames: user_id, type, item_id
constraintName: unique_bookmark_user_id_type_item_id
- changeSet:
id: v43.00-054
author: snoe
comment: Added 0.43.0 - bookmark ordering
changes:
- addUniqueConstraint:
tableName: bookmark_ordering
columnNames: user_id, ordering
constraintName: unique_bookmark_user_id_ordering
- changeSet:
id: v43.00-055
author: snoe
comment: Added 0.43.0 - bookmark ordering
changes:
- createIndex:
tableName: bookmark_ordering
columns:
- column:
name: user_id
indexName: idx_bookmark_ordering_user_id
- changeSet:
id: v43.00-056
author: qnkhuat
comment: >-
Added 0.43.0 - Rename general permission revision table
It's safe to rename this table without breaking downgrades compatibility because this table was also added in 0.43.0.
changes:
- renameTable:
oldTableName: general_permissions_revision
newTableName: application_permissions_revision
- changeSet:
id: v43.00-057
author: qnkhuat
comment: Added 0.43.0 - Rename general_permissions_revision_id_seq
failOnError: false # mysql and h2 don't have this sequence
preConditions:
- onFail: MARK_RAN
- dbms:
type: postgresql
changes:
- sql:
- sql: ALTER SEQUENCE general_permissions_revision_id_seq RENAME TO application_permissions_revision_id_seq;
- changeSet:
id: v43.00-058
author: qnkhuat
comment: Added 0.43.0 - Rename general permissios to application permissions
changes:
- sql:
sql: >-
UPDATE permissions
SET object = REPLACE(object, '/general/', '/application/')
WHERE object LIKE '/general/%';
- changeSet:
id: v43.00-059
author: adam-james
comment: Added 0.43.0 - disallow nil timeline icons
changes:
- addNotNullConstraint:
columnDataType: varchar(128)
tableName: timeline
columnName: icon
defaultNullValue: "star"
- changeSet:
id: v43.00-060
author: adam-james
comment: Added 0.43.0 - disallow nil timeline event icons
changes:
- addNotNullConstraint:
columnDataType: varchar(128)
tableName: timeline_event
columnName: icon
defaultNullValue: "star"
- changeSet:
id: v43.00-062
author: snoe
comment: Added 0.43.0 - Unify datatype with revision.timestamp for timezone info (see 17829).
changes:
- modifyDataType:
tableName: revision
columnName: timestamp
newDataType: ${timestamp_type}
- changeSet:
id: v44.00-000
author: dpsutton
comment: Added 0.44.0 - Persisted Info for models
changes:
- createTable:
tableName: persisted_info
remarks: Table holding information about persisted models
columns:
- column:
name: id
type: int
autoIncrement: true
constraints:
primaryKey: true
nullable: false
- column:
name: database_id
type: int
remarks: 'ID of the database associated to the persisted card'
constraints:
nullable: false
referencedTableName: metabase_database
referencedColumnNames: id
foreignKeyName: fk_persisted_info_database_id
deleteCascade: true
- column:
name: card_id
type: int
remarks: 'ID of the Card model persisted'
constraints:
nullable: false
unique: true
referencedTableName: report_card
referencedColumnNames: id
foreignKeyName: fk_persisted_info_card_id
deleteCascade: true
- column:
remarks: Slug of the card which will form the persisted table name
name: question_slug
type: ${text.type}
constraints:
nullable: false
- column:
remarks: Name of the table persisted
name: table_name
type: ${text.type}
constraints:
nullable: false
- column:
remarks: JSON object that captures the state of the table when we persisted
name: definition
type: ${text.type}
constraints:
nullable: true
- column:
remarks: Hash of the query persisted
name: query_hash
type: ${text.type}
constraints:
nullable: true
- column:
remarks: Indicating whether the persisted table is active and can be swapped
name: active
type: boolean
defaultValueBoolean: false
constraints:
nullable: false
- column:
remarks: Persisted table state (creating, persisted, refreshing, deleted)
name: state
type: ${text.type}
constraints:
nullable: false
- column:
remarks: The timestamp of when the most recent refresh was started
name: refresh_begin
type: ${timestamp_type}
constraints:
nullable: false
- column:
remarks: The timestamp of when the most recent refresh ended
name: refresh_end
type: ${timestamp_type}
constraints:
nullable: true
- column:
remarks: The timestamp of when the most recent state changed
name: state_change_at
type: ${timestamp_type}
constraints:
nullable: true
- column:
remarks: Error message from persisting if applicable
name: error
type: ${text.type}
constraints:
nullable: true
- column:
remarks: The timestamp of when the model was first persisted
name: created_at
type: ${timestamp_type}
defaultValueComputed: current_timestamp
constraints:
nullable: false
- column:
name: creator_id
type: int
remarks: The person who persisted a model
constraints:
nullable: false
referencedTableName: core_user
referencedColumnNames: id
foreignKeyName: fk_persisted_info_ref_creator_id
deferrable: false
initiallyDeferred: false
- changeSet:
id: v44.00-001
author: snoe
comment: Added 0.44.0 - Remove not null constraint from persisted_info.creator_id
changes:
- dropNotNullConstraint:
tableName: persisted_info
columnName: creator_id
columnDataType: int
# v44.00-002 through -011 add entity_id columns to several internal entities.
# These are fixed-width string fields populated with a random 21-character
# NanoID value, and used by the serialization system to de-duplicate entities
# in a portable way. See the serialization design doc in the design repo.
- changeSet:
id: v44.00-002
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: metric
- changeSet:
id: v44.00-003
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: segment
- changeSet:
id: v44.00-004
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: collection
- changeSet:
id: v44.00-005
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: report_dashboard
- changeSet:
id: v44.00-006
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: dimension
- changeSet:
id: v44.00-007
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: pulse
- changeSet:
id: v44.00-008
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: report_card
- changeSet:
id: v44.00-009
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: native_query_snippet
- changeSet:
id: v44.00-010
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: timeline
- changeSet:
id: v44.00-011
author: braden
comment: Added 0.44.0 - add entity_id column to all internal entities
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: report_dashboardcard
# Migrations v44.00-012 thru v44.00-022 have been moved to v45.00-001 thru v45.00-011
- changeSet:
id: v44.00-023
author: qnkhuat
comment: Added 0.44.0 - Add parameters to report_card
validCheckSum: ANY
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: parameters
type: ${text.type}
remarks: List of parameter associated to a card
constraints:
nullable: true
- changeSet:
id: v44.00-025
author: qnkhuat
comment: Added 0.44.0 - Add parameter_mappings to report_card
validCheckSum: ANY
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: parameter_mappings
type: ${text.type}
remarks: List of parameter associated to a card
constraints:
nullable: true
- changeSet:
id: v44.00-027
author: adam-james
comment: Added 0.44.0. Drop NOT NULL constraint for core_user.first_name
changes:
- dropNotNullConstraint:
tableName: core_user
columnName: first_name
columnDataType: varchar(254)
- changeSet:
id: v44.00-028
author: adam-james
comment: Added 0.44.0. Drop NOT NULL constraint for core_user.last_name
changes:
- dropNotNullConstraint:
tableName: core_user
columnName: last_name
columnDataType: varchar(254)
- changeSet:
id: v44.00-029
author: qnkhuat
comment: Added 0.44.0 - Add has_more_values to metabase_fieldvalues
changes:
- addColumn:
tableName: metabase_fieldvalues
columns:
- column:
name: has_more_values
type: boolean
remarks: true if the stored values list is a subset of all possible values
defaultValueBoolean: false
- changeSet:
id: v44.00-030
author: snoe
comment: Added 0.44.0 - Add database_required to metabase_field
changes:
- addColumn:
tableName: metabase_field
columns:
- column:
name: database_required
type: boolean
remarks: Indicates this field is required by the database for new records. Usually not null and without a default.
defaultValueBoolean: false
constraints:
nullable: false
# Migrations v44.00-031 and v44.00-032 were moved to v45.00-012 and v45.00-013 respectively
- changeSet:
id: v44.00-033
author: qnkhuat
comment: >-
Added 0.43.0. Grant the 'All Users' Permissions Group readwrite perms for the Root Snippets Collection.
preConditions:
- onFail: MARK_RAN
# HACK: only run this on new instances (#21940)
- sqlCheck:
expectedResult: 0
sql: >-
SELECT count(*) AS user_count FROM core_user
changes:
- sql:
sql: >-
INSERT INTO permissions (group_id, object)
SELECT
all_users_group.id AS group_id,
'/collection/namespace/snippets/root/' AS object
FROM (
SELECT id
FROM permissions_group
WHERE name = 'All Users'
) all_users_group
LEFT JOIN permissions p
ON all_users_group.id = p.group_id
AND p.object = '/collection/namespace/snippets/root/'
WHERE p.object IS NULL;
- changeSet:
id: v44.00-035
author: qnkhuat
comment: Added 0.44.0. Add type to fieldvalues
validCheckSum: ANY
changes:
- addColumn:
tableName: metabase_fieldvalues
columns:
- column:
name: type
type: varchar(32)
defaultValue: 'full'
remarks: Type of FieldValues
constraints:
nullable: false
- changeSet:
id: v44.00-037
author: qnkhuat
comment: Added 0.44.0. Add type to fieldvalues
changes:
- addColumn:
tableName: metabase_fieldvalues
columns:
- column:
name: hash_key
type: ${text.type}
remarks: Hash key for a cached fieldvalues
constraints:
nullable: true
- changeSet:
id: v44.00-038
author: metamben
comment: Added 0.44.0 - Add collection_preview to report_card
changes:
- addColumn:
tableName: report_card
columns:
- column:
name: collection_preview
type: boolean
remarks: Indicating whether the card should be visualized in the collection preview
defaultValueBoolean: true
constraints:
nullable: false
- changeSet:
id: v44.00-039
author: qnkhuat
comment: Added 0.44.0 - Add template_tags to native_query_snippet
changes:
- addColumn:
tableName: native_query_snippet
columns:
- column:
name: template_tags
type: ${text.type}
remarks: Template tags for a snippet
constraints:
nullable: true
- changeSet:
id: v44.00-041
author: braden
comment: Added 0.44.0 - add entity_id column to PulseCard, PulseChannel
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: pulse_card
- changeSet:
id: v44.00-042
author: braden
comment: Added 0.44.0 - add entity_id column to PulseCard, PulseChannel
changes:
- addColumn:
columns:
- column:
remarks: Random NanoID tag for unique identity.
name: entity_id
type: char(21)
constraints:
nullable: true
unique: true
tableName: pulse_channel
- changeSet:
id: v44.00-044
author: qnkhuat
comment: Added 0.44.0 - drop native_query_snippet.template_tags added in v44.00-039
changes:
- dropColumn:
tableName: native_query_snippet
columnName: template_tags
# >>>>>>>>>> NEW MIGRATIONS SHOULD BE PUT IN 001_update_migrations.yaml <<<<<<<<<<