@@ -351,10 +351,30 @@ func (c *Cluster) execCreateDatabaseSchema(databaseName, schemaName, dbOwner, sc
351351 }
352352
353353 // set default privileges for schema
354+ // the schemaOwner defines them for global database roles
354355 c .execAlterSchemaDefaultPrivileges (schemaName , schemaOwner , databaseName )
356+
357+ // if schemaOwner and dbOwner differ we know that <databaseName>_<schemaName> default roles were created
355358 if schemaOwner != dbOwner {
356- c .execAlterSchemaDefaultPrivileges (schemaName , dbOwner , databaseName + "_" + schemaName )
357- c .execAlterSchemaDefaultPrivileges (schemaName , schemaOwner , databaseName + "_" + schemaName )
359+ defaultUsers := c .Spec .PreparedDatabases [databaseName ].PreparedSchemas [schemaName ].DefaultUsers
360+
361+ // define schema privileges of <databaseName>_<schemaName>_owner_user for global roles, too
362+ if defaultUsers {
363+ c .execAlterSchemaDefaultPrivileges (schemaName , schemaOwner + constants .UserRoleNameSuffix , databaseName )
364+ }
365+
366+ // collect all possible owner roles and define default schema privileges
367+ // for <databaseName>_<schemaName>_reader/writer roles
368+ owners := c .getOwnerRoles (databaseName , c .Spec .PreparedDatabases [databaseName ].DefaultUsers )
369+ owners = append (owners , c .getOwnerRoles (databaseName + "_" + schemaName , defaultUsers )... )
370+ for _ , owner := range owners {
371+ c .execAlterSchemaDefaultPrivileges (schemaName , owner , databaseName + "_" + schemaName )
372+ }
373+ } else {
374+ // define schema privileges of <databaseName>_owner_user for global roles, too
375+ if c .Spec .PreparedDatabases [databaseName ].DefaultUsers {
376+ c .execAlterSchemaDefaultPrivileges (schemaName , schemaOwner + constants .UserRoleNameSuffix , databaseName )
377+ }
358378 }
359379
360380 return nil
@@ -418,6 +438,15 @@ func makeUserFlags(rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin
418438 return result
419439}
420440
441+ func (c * Cluster ) getOwnerRoles (dbObjPath string , withUser bool ) (owners []string ) {
442+ owners = append (owners , dbObjPath + constants .OwnerRoleNameSuffix )
443+ if withUser {
444+ owners = append (owners , dbObjPath + constants .OwnerRoleNameSuffix + constants .UserRoleNameSuffix )
445+ }
446+
447+ return owners
448+ }
449+
421450// getExtension returns the list of current database extensions
422451// The caller is responsible for opening and closing the database connection
423452func (c * Cluster ) getExtensions () (dbExtensions map [string ]string , err error ) {
0 commit comments