mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
RBAC: Add primary key to seed_assignment table (#56540)
* RBAC: Add seed_assignment migrations from enterprise * RBAC: Create migration to add primary key to seed_assignment table
This commit is contained in:
parent
5fcec05695
commit
b1761908c2
@ -0,0 +1,121 @@
|
|||||||
|
package accesscontrol
|
||||||
|
|
||||||
|
import (
|
||||||
|
"xorm.io/xorm"
|
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/sqlstore/migrator"
|
||||||
|
)
|
||||||
|
|
||||||
|
const migSQLITERoleNameNullable = `ALTER TABLE seed_assignment ADD COLUMN tmp_role_name VARCHAR(190) DEFAULT NULL;
|
||||||
|
UPDATE seed_assignment SET tmp_role_name = role_name;
|
||||||
|
ALTER TABLE seed_assignment DROP COLUMN role_name;
|
||||||
|
ALTER TABLE seed_assignment RENAME COLUMN tmp_role_name TO role_name;`
|
||||||
|
|
||||||
|
func AddSeedAssignmentMigrations(mg *migrator.Migrator) {
|
||||||
|
seedAssignmentTable := migrator.Table{Name: "seed_assignment"}
|
||||||
|
|
||||||
|
mg.AddMigration("add action column to seed_assignment",
|
||||||
|
migrator.NewAddColumnMigration(seedAssignmentTable,
|
||||||
|
&migrator.Column{Name: "action", Type: migrator.DB_Varchar, Length: 190, Nullable: true}))
|
||||||
|
|
||||||
|
mg.AddMigration("add scope column to seed_assignment",
|
||||||
|
migrator.NewAddColumnMigration(seedAssignmentTable,
|
||||||
|
&migrator.Column{Name: "scope", Type: migrator.DB_Varchar, Length: 190, Nullable: true}))
|
||||||
|
|
||||||
|
mg.AddMigration("remove unique index builtin_role_role_name before nullable update",
|
||||||
|
migrator.NewDropIndexMigration(seedAssignmentTable,
|
||||||
|
&migrator.Index{Cols: []string{"builtin_role", "role_name"}, Type: migrator.UniqueIndex}))
|
||||||
|
|
||||||
|
mg.AddMigration("update seed_assignment role_name column to nullable",
|
||||||
|
migrator.NewRawSQLMigration("").
|
||||||
|
SQLite(migSQLITERoleNameNullable).
|
||||||
|
Postgres("ALTER TABLE `seed_assignment` ALTER COLUMN role_name DROP NOT NULL;").
|
||||||
|
Mysql("ALTER TABLE seed_assignment MODIFY role_name VARCHAR(190) DEFAULT NULL;"))
|
||||||
|
|
||||||
|
mg.AddMigration("add unique index builtin_role_name back",
|
||||||
|
migrator.NewAddIndexMigration(seedAssignmentTable,
|
||||||
|
&migrator.Index{Cols: []string{"builtin_role", "role_name"}, Type: migrator.UniqueIndex}))
|
||||||
|
|
||||||
|
mg.AddMigration("add unique index builtin_role_action_scope",
|
||||||
|
migrator.NewAddIndexMigration(seedAssignmentTable,
|
||||||
|
&migrator.Index{Cols: []string{"builtin_role", "action", "scope"}, Type: migrator.UniqueIndex}))
|
||||||
|
|
||||||
|
mg.AddMigration("add primary key to seed_assigment", &seedAssignmentPrimaryKeyMigrator{})
|
||||||
|
}
|
||||||
|
|
||||||
|
type seedAssignmentPrimaryKeyMigrator struct {
|
||||||
|
migrator.MigrationBase
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *seedAssignmentPrimaryKeyMigrator) SQL(dialect migrator.Dialect) string {
|
||||||
|
return CodeMigrationSQL
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *seedAssignmentPrimaryKeyMigrator) Exec(sess *xorm.Session, mig *migrator.Migrator) error {
|
||||||
|
driver := mig.Dialect.DriverName()
|
||||||
|
|
||||||
|
if driver == migrator.MySQL {
|
||||||
|
_, err := sess.Exec("ALTER TABLE seed_assignment ADD id INT NOT NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY (id)")
|
||||||
|
return err
|
||||||
|
} else if driver == migrator.Postgres {
|
||||||
|
_, err := sess.Exec("ALTER TABLE seed_assignment ADD COLUMN id SERIAL PRIMARY KEY")
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// sqlite does not allow to add constraint after a table is created
|
||||||
|
// We need to create a new table with desired columns, move data to new table, delete old table and rename new table to old
|
||||||
|
|
||||||
|
// create temp table
|
||||||
|
_, err := sess.Exec(`
|
||||||
|
CREATE TABLE seed_assignment_temp (
|
||||||
|
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||||
|
builtin_role TEXT,
|
||||||
|
action TEXT,
|
||||||
|
scope TEXT,
|
||||||
|
role_name TEXT
|
||||||
|
);
|
||||||
|
`)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy data to temp table
|
||||||
|
_, err = sess.Exec("INSERT INTO seed_assignment_temp (builtin_role, action, scope, role_name) SELECT * FROM seed_assignment;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// drop indices on old table
|
||||||
|
_, err = sess.Exec("DROP INDEX UQE_seed_assignment_builtin_role_action_scope;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = sess.Exec("DROP INDEX UQE_seed_assignment_builtin_role_role_name;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// drop old table
|
||||||
|
_, err = sess.Exec("DROP TABLE seed_assignment;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// rename temp table to old name
|
||||||
|
_, err = sess.Exec("ALTER TABLE seed_assignment_temp RENAME TO seed_assignment;")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// recreate indexes on new table
|
||||||
|
_, err = sess.Exec("CREATE UNIQUE INDEX UQE_seed_assignment_builtin_role_action_scope ON seed_assignment (builtin_role, action, scope);")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
_, err = sess.Exec("CREATE UNIQUE INDEX UQE_seed_assignment_builtin_role_role_name ON seed_assignment (builtin_role, role_name);")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
@ -98,6 +98,7 @@ func (*OSSMigrations) AddMigration(mg *Migrator) {
|
|||||||
ualert.UpdateRuleGroupIndexMigration(mg)
|
ualert.UpdateRuleGroupIndexMigration(mg)
|
||||||
accesscontrol.AddManagedFolderAlertActionsRepeatMigration(mg)
|
accesscontrol.AddManagedFolderAlertActionsRepeatMigration(mg)
|
||||||
accesscontrol.AddAdminOnlyMigration(mg)
|
accesscontrol.AddAdminOnlyMigration(mg)
|
||||||
|
accesscontrol.AddSeedAssignmentMigrations(mg)
|
||||||
}
|
}
|
||||||
|
|
||||||
func addMigrationLogMigrations(mg *Migrator) {
|
func addMigrationLogMigrations(mg *Migrator) {
|
||||||
|
Loading…
Reference in New Issue
Block a user