--- /dev/null
+# Define for reassigning the ownership of objects within a database. See README.md for more details.
+# This enables us to force the a particular ownership for objects within a database
+define postgresql::server::reassign_owned_by (
+ String $old_role,
+ String $new_role,
+ String $db,
+ String $psql_user = $postgresql::server::user,
+ Integer $port = $postgresql::server::port,
+ Hash $connect_settings = $postgresql::server::default_connect_settings,
+) {
+
+ $sql_command = "REASSIGN OWNED BY \"${old_role}\" TO \"${new_role}\""
+
+ $group = $postgresql::server::group
+ $psql_path = $postgresql::server::psql_path
+
+ #
+ # Port, order of precedence: $port parameter, $connect_settings[PGPORT], $postgresql::server::port
+ #
+ if $port != undef {
+ $port_override = $port
+ } elsif $connect_settings != undef and has_key( $connect_settings, 'PGPORT') {
+ $port_override = undef
+ } else {
+ $port_override = $postgresql::server::port
+ }
+
+ $onlyif = "SELECT tablename FROM pg_catalog.pg_tables WHERE
+ schemaname NOT IN ('pg_catalog', 'information_schema') AND
+ tableowner = '${old_role}'
+ UNION ALL SELECT proname FROM pg_catalog.pg_proc WHERE
+ pg_get_userbyid(proowner) = '${old_role}'
+ UNION ALL SELECT viewname FROM pg_catalog.pg_views WHERE
+ pg_views.schemaname NOT IN ('pg_catalog', 'information_schema') AND
+ viewowner = '${old_role}'
+ UNION ALL SELECT relname FROM pg_catalog.pg_class WHERE
+ relkind='S' AND pg_get_userbyid(relowner) = '${old_role}'"
+
+ postgresql_psql { "reassign_owned_by:${db}:${sql_command}":
+ command => $sql_command,
+ db => $db,
+ port => $port_override,
+ connect_settings => $connect_settings,
+ psql_user => $psql_user,
+ psql_group => $group,
+ psql_path => $psql_path,
+ onlyif => $onlyif,
+ require => Class['postgresql::server']
+ }
+
+ if($old_role != undef and defined(Postgresql::Server::Role[$old_role])) {
+ Postgresql::Server::Role[$old_role]->Postgresql_psql["reassign_owned_by:${db}:${sql_command}"]
+ }
+ if($new_role != undef and defined(Postgresql::Server::Role[$new_role])) {
+ Postgresql::Server::Role[$new_role]->Postgresql_psql["reassign_owned_by:${db}:${sql_command}"]
+ }
+
+ if($db != undef and defined(Postgresql::Server::Database[$db])) {
+ Postgresql::Server::Database[$db]->Postgresql_psql["reassign_owned_by:${db}:${sql_command}"]
+ }
+}