Me gustaría configurar usuarios específicos de la aplicación para una base de datos, solo con fines de auditoría/depuración, pero use el rol de usuario raíz "postgres" para la creación de tablas, ya que ya tiene los privilegios predeterminados configurados adecuadamente (y también porque en mi caso, la mayoría de las tablas ya son propiedad de ese usuario).
La aplicación solo necesitaría este permiso de creación/modificación de tablas al ejecutar migraciones, pero estaría bien si lo tuvieran todo el tiempo si fuera más fácil. Sin embargo, no he encontrado ninguna forma de usar SET ROLE con éxito en Rails.
Pensé que funcionaría agregar una nueva tarea de rake que establezca el rol antes de que se ejecute la tarea db:migrate , así:
# in lib/tasks/set_role.rake namespace :db do task :set_role do ActiveRecord::Base.connection.execute("SET ROLE postgres") end end # in initializers/migration_hooks.rb Rake::Task["db:migrate"].enhance ["db:set_role_postsgres"]Pero eso no funcionó...
No estoy seguro de por qué lo anterior no funcionó, pero tuve que poner todo esto en el archivo .rake y luego funcionó:
# lib/tasks/migration_hooks.rb namespace :db do task set_role_postsgres: :environment do puts "Setting Role to 'postgres'" ActiveRecord::Base.connection.execute("SET ROLE postgres") end end Rake::Task["db:load_config"].enhance ["db:set_role_postsgres"] Nota: La tarea db:load_config es un requisito previo para todas las tareas de db , por lo que debería manejar la configuración del rol no solo para db:migrate , sino también para db:migrate:up , db:migrate:down , db:rollback , etc.
Acabo de encontrarme necesitando dicha funcionalidad, pero para todas las conexiones de ActiveRecord . En una aplicación Rails v7 utilicé el siguiente parche mono:
module PostgreSQLAdapterWithSetRole def initialize(connection, logger, connection_parameters, config) super(connection, logger, connection_parameters, config) if config[:role] connection.exec("SET ROLE #{config[:role]};") end end end ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.prepend(PostgreSQLAdapterWithSetRole) Esto lee un valor de configuración de role de database.yml de datos.yml y, si se establece un problema, SET ROLE inmediatamente después de establecer la conexión.