diff --git a/pkg/cmd/grafana-cli/commands/commands.go b/pkg/cmd/grafana-cli/commands/commands.go index 519ae771b3e..368934759da 100644 --- a/pkg/cmd/grafana-cli/commands/commands.go +++ b/pkg/cmd/grafana-cli/commands/commands.go @@ -197,6 +197,11 @@ var adminCommands = []*cli.Command{ }, }, }, + { + Name: "flush-rbac-seed-assignment", + Usage: "Clears RBAC seeding to force re-seeding on next startup. Use after running an Enterprise build, then an OSS build, then an Enterprise build again.", + Action: runDbCommand(flushSeedAssignment), + }, } var Commands = []*cli.Command{ diff --git a/pkg/cmd/grafana-cli/commands/flush_rbac.go b/pkg/cmd/grafana-cli/commands/flush_rbac.go new file mode 100644 index 00000000000..ab733d8873b --- /dev/null +++ b/pkg/cmd/grafana-cli/commands/flush_rbac.go @@ -0,0 +1,33 @@ +package commands + +import ( + "context" + + "github.com/grafana/grafana/pkg/cmd/grafana-cli/logger" + "github.com/grafana/grafana/pkg/cmd/grafana-cli/utils" + "github.com/grafana/grafana/pkg/infra/db" + "github.com/grafana/grafana/pkg/setting" +) + +func flushSeedAssignment(c utils.CommandLine, cfg *setting.Cfg, sqlStore db.DB) error { + return sqlStore.WithDbSession(context.Background(), func(sess *db.Session) error { + exists, err := sess.IsTableExist("seed_assignment") + if err != nil { + return err + } + if !exists { + logger.Infof("seed_assignment table does not exist, skipping.") + return nil + } + + result, err := sess.Exec("DELETE FROM seed_assignment") + if err != nil { + return err + } + + rowsAffected, _ := result.RowsAffected() + logger.Infof("Flushed seed_assignment table (%d rows deleted).", rowsAffected) + logger.Info("Restart Grafana to repopulate this table on next startup with the default RBAC assignments.") + return nil + }) +}