2009/7/24 Bas Driessen <[email protected]>

>  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.
>

Ok, then I'll do this ASAP, unless you want to do it yourself (all the
statements are located in the beginning of the gda-postgres-meta.c file)?

Vivien
_______________________________________________
gnome-db-list mailing list
[email protected]
http://mail.gnome.org/mailman/listinfo/gnome-db-list

Reply via email to