We upgraded our PG from 8.4 to 9.2 and found that our pg_dump and pg_restore caused all of the large objects to be given permission to our db admin user, but not our application user. This resulted in some null pointers in our java code when trying to access an OID column, with the PG error saying: permission denied for large object NNNN.
I checked with the excellent PG team and they pointed out that prior to 9.0 large objects didn't have any access permissions/roles assigned to them. So I guess on restore, all of the large objects became owned by our DB admin account, and despite all of our application role table GRANTS, these permission changes did not go down to the related large objects.
I'm just checking if the latest JDBC library is doing anything special with respect to large objects and permissions. We just use the PreparedStatement getBlob()/setBlob(). Will the large objects be owned by the role that executes the INSERT?
do $$ declare r record; begin for r in select loid from pg_catalog.pg_largeobject loop execute 'ALTER LARGE OBJECT ' || r.loid || ' OWNER TO DBUSER'; end loop; end$$; CLOSE ALL;