On Fri, 2009-07-24 at 13:55 +0200, Vivien Malerba wrote: > > > > 2009/7/24 Bas Driessen <[email protected]> > > > On Fri, 2009-07-24 at 13:47 +0200, Vivien Malerba wrote: > > > > > > > 2009/7/24 Bas Driessen <[email protected]> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > 2009/7/19 Bas Driessen <[email protected]> > > > > > > > > > > > > > > > > > > > Hello, > > > > > > > > > > > > > > > > > > > > Question regarding partial meta store update. I found that the following to > update a single table does not appear to work: > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > g_print ("\nPartial metastore update for table '%s'...\n", TABLE_NAME); > > > > > > > > > > > > > > > > > > > > GdaMetaContext mcontext = {"_tables", 1, NULL, NULL}; > > > > > > > > > > > > > > > > > > > > mcontext.column_names = g_new (gchar *, 1); > > > > > > > > > > > > > > > > > > > > mcontext.column_names[0] = "table_name"; > > > > > > > > > > > > > > > > > > > > mcontext.column_values = g_new (GValue *, 1); > > > > > > > > > > > > > > > > > > > > g_value_set_string ((mcontext.column_values[0] = gda_value_new > (G_TYPE_STRING)), TABLE_NAME); > > > > > > > > > > > > > > > > > > > > if (!gda_connection_update_meta_store (connection, &mcontext, &error)) > > > > > > > > > > > > > > > > > > > > return -1; > > > > > > > > > > > > > > > > > > > > After this, my meta store is NOT updated. > > > > > > > > > > > > > > > > > > > > > > > > > > > This > may depend on the actual value of TABLE_NAME, specifically if it is a mix of > upper and lower case, or if it's a reserved keyword. The proper way is: > > > > > > > > > tmp = > gda_sql_identifier_quote (TABLE_NAME, cnc, NULL, TRUE, FALSE); // or with the > last argument being TRUE, see the doc > > > > > > > > > > g_value_set_string ((mcontext.column_values[0] = gda_value_new > (G_TYPE_STRING)), tmp); > > > > > > > > > > g_free (tmp); > > > > > > > > > > > > > > > > > > Note > that this is brand new (just been sorted out) and will require the master or > LIBGDA_4.0 branches up to date. > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > ... > > > > > > ... > > > > > > ... > > > > > > > > > > > > > > > > > > > > > > > > > Which version of > > > > > > > PostgreSQL and > > > > > > > libgda are you > > > > > > > using? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > I am on the latest > > > > > > LIBGDA_4.0 git > > > > > > branch. (so I am NOT > > > > > > on master, perhaps > > > > > > that may be the > > > > > > issue?) > > > > > > > > > > > > I am using > > > > > > postgresql 8.3.7 > > > > > > (default with Fedora > > > > > > 11) > > > > > > > > > > > > $ rpm -qa | grep > > > > > > postgresql > > > > > > > postgresql-devel-8.3.7-1.fc11.x86_64 > > > > > > > postgresql-python-8.3.7-1.fc11.x86_64 > > > > > > > postgresql-libs-8.3.7-1.fc11.x86_64 > > > > > > > postgresql-server-8.3.7-1.fc11.x86_64 > > > > > > > postgresql-8.3.7-1.fc11.x86_64 > > > > > > > > > > > > What additional > > > > > > permissions (grants) > > > > > > do I need in > > > > > > Postgresql to be > > > > > > able to retrieve the > > > > > > data that is used > > > > > > the build the meta > > > > > > store? For testing > > > > > > now I have assigned > > > > > > an administrator > > > > > > role, but that is > > > > > > probably not a good > > > > > > idea in production? > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > No specific permission is > > > > > > required, except that the > > > > > > pg_catalog and > > > > > > information_schema schemas > > > > > > need to be readable (but I > > > > > > think it's the case all the > > > > > > time). Moreover, the meta > > > > > > data retreival works when > > > > > > updating all (calling > > > > > > gda_connection_update_meta_store() > with a NULL context). > > > > > > > > > > > > I don't see why it does not > > > > > > work... > > > > > > > > > > > > What you can do is uncomment > > > > > > the line 2248 of > > > > > > gda-meta-store.c to define > > > > > > DEBUG_STORE_MODIFY, > > > > > > recompile and run your code > > > > > > again. You'll then have a > > > > > > lot of information about the > > > > > > update process of the > > > > > > GdaMetaStore, and maybe > > > > > > you'll see what's wrong. Be > > > > > > aware that when running > > > > > > gda_connection_update_meta_store(), > the whole process takes place in a transaction so if something fails, then > the meta store is reverted to what it was before the call. > > > > > > > > > > > > If you want you can send me > > > > > > the output it produces so I > > > > > > can have a look. > > > > > > > > > > > > > > > > > > > > > > > > > > Output as follows: > > > > > > > > > > CURRENT: > > > > > catalog_name > > > > > ------------ > > > > > stock > > > > > (1 row) > > > > > ------- BEGIN > > > > > FIND row 0(/0) returned row 0 > > > > > (unchanged) > > > > > Suggest update data into table > > > > > '_schemata': [catalog_name => > > > > > stock] > > > > > CURRENT: > > > > > catalog_name | schema_name | > > > > > schema_owner | schema_internal > > > > > > -------------+-------------+--------------+---------------- > > > > > (0 rows) > > > > > NEW for table _schemata: > > > > > catalog_name | schema_name | > > > > > schema_owner | case > > > > > > -------------+-------------+--------------+----- > > > > > (0 rows) > > > > > wrapped as: > > > > > catalog_name | schema_name | > > > > > schema_owner | case > > > > > > -------------+-------------+--------------+----- > > > > > (0 rows) > > > > > ------- COMMIT > > > > > > > > > > > > > > > This does not look healthy as > > > > > all is empty. Should this list > > > > > something from the current > > > > > Meta Store? > > > > > > > > > > > > > > > > > > > > > OK, found the issue. It appears > > > > to be a permission problem in > > > > Postgresql. If I configure the > > > > data source (cnc) to connect as > > > > user "postgres" (administrator > > > > account), then the partial > > > > update works OK. If I do it as > > > > the "normal" user, it does not > > > > work. This is strange as the > > > > FULL update does work for that > > > > user. What additional permission > > > > is required for the 'normal' > > > > user? This may be a little bit > > > > out of the libgda scope, but > > > > half kind of overlapping as > > > > libgda should either fail for > > > > all cases if it can not reach > > > > the system tables or work in all > > > > cases. > > > > > > > > > > > > > > > > > > > Further to this. Tried to work it > > > out from Postgres, but the only > > > way the libgda partial meta store > > > updates work is if I set the > > > normal user as superuser: > > > > > > ALTER USER bas with SUPERUSER > > > > > > then all works OK, however it is > > > not a good idea to have superuser > > > rights to a normal user for the > > > obvious reasons. When I switch > > > back to normal user mode: > > > > > > ALTER USER bas with NOSUPERUSER > > > > > > then all fails again with the > > > empty debug table output above. I > > > need to work out which Postgresql > > > system tables libgda tries to > > > access when doing a partial > > > update. Any pointers of how to get > > > this done quickly/which area to > > > look? Any other postgresql users > > > on this list who has come across > > > this? > > > > > > > > > > > > > > > > > > Thanks for the quick analysis, I'll look > > > at this problem ASAP. > > > > > > In the meanwhile, you can run the very > > > same SELECT statements which are being run > > > when doing a partial meta store update in > > > a psql console and see where the problem > > > comes from. For this, all you have to do > > > is set the GDA_CONNECTION_EVENTS_SHOW > > > environment variable to COMMAND, which > > > will show you all the statements run along > > > with the variables' values when run (the > > > variable's values come first in the dump). > > > > > > I think the culprit is the > > > I_STMT_TABLE_NAMED SQL statement which > > > you'll find at the beginning of the > > > gda-postgres-meta.c file. I seems the > > > problem is with the permission denied to > > > access the pg_authid catalog table. > > > > > > > > > > > > > > > Maybe replacing pg_authid with pg_roles is OK. > > > > > > > > > > 1 step closer. Yes, the pg_authid was a problem as > > well, but I bypassed that for now by giving it > > select access for the end-user (but yes this should > > be addressed as well) > > > > > > The following SQL: > > > > select * from information_schema.schemata; > > > > This returns nothing when running as normal user in > > the psql shell, but as a superuser returns the > > following: > > > > # select * from information_schema.schemata; > > catalog_name | schema_name | schema_owner | > > default_character_set_catalog | > > default_character_set_schema | > > default_character_set_name | sql_path > > > --------------+--------------------+--------------+-------------------------------+------------------------------+----------------------------+---------- > > stock | pg_toast | postgres | > > | | > > | > > stock | pg_temp_1 | postgres | > > | | > > | > > stock | pg_toast_temp_1 | postgres | > > | | > > | > > stock | public | postgres | > > | | > > | > > stock | information_schema | postgres | > > | | > > | > > stock | pg_catalog | postgres | > > | | > > | > > (6 rows) > > > > > > This is correct from a Postgresql point of view. > > They are not "supposed to provide the same results". > > Per SQL99, the schemata view is supposed to identify > > the schemata in a catalog that is owned by a given > > user. The SQL definition in the spec makes it clear > > that it only shows schemas owned by CURRENT_USER or > > a role that CURRENT_USER is a member of. Can this be > > resolved in libgda not to use the schemata table? > > > > > > Yes, instead we could use the pg_catalog.pg_namespace > > table, along with the pg_catalog.pg_roles as a replacement > > for pg_authid. In fact the information_schema.schemata is > > defined as: > > > > SELECT > > current_database()::information_schema.sql_identifier AS > > catalog_name, n.nspname::information_schema.sql_identifier > > AS schema_name, u.rolname::information_schema.sql_identifier > > AS schema_owner, NULL::character > > varying::information_schema.sql_identifier AS > > default_character_set_catalog, NULL::character > > varying::information_schema.sql_identifier AS > > default_character_set_schema, NULL::character > > varying::information_schema.sql_identifier AS > > default_character_set_name, NULL::character > > varying::information_schema.character_data AS sql_path > > FROM pg_namespace n, pg_authid u > > WHERE n.nspowner = u.oid AND pg_has_role(n.nspowner, > > 'USAGE'::text); > > > > > Just did a quick test with your SQL statement (SELECT > current_database..... etc) , but same problem. postgres user > returns data. Normal user returns no data. > > This is expected as the SQL above is the definition of > information_schema.schemata. This was just to illustrate the > filtering on the current role.
Understood. pg_catalog.pg_namespace table and pg_catalog.pg_roles are accessible to the normal user (just tested to confirm), so it has my thumbs up. Bas.
_______________________________________________ gnome-db-list mailing list [email protected] http://mail.gnome.org/mailman/listinfo/gnome-db-list
