Обсуждение: has_table_priviledge
postgresql'rs-
i can't, for the live of me, figure out why this does not work?
grib_tables=# \d btrel
Table "btrel"
Column | Type | Modifiers
---------+------+-----------
relname | text | not null
Primary key: btrel_pkey
Triggers: RI_ConstraintTrigger_5481788,
RI_ConstraintTrigger_5481786,
RI_ConstraintTrigger_4557550,
RI_ConstraintTrigger_4557548
grib_tables=# select has_table_priviledge('ahoward',"btrel",'update');
ERROR: Attribute 'btrel' not found
grib_tables=# select has_table_priviledge('ahoward','btrel','update');
ERROR: Function 'has_table_priviledge(unknown, unknown, unknown)' does not exist
Unable to identify a function that satisfies the given argument types
You may need to add explicit typecasts
grib_tables=# select has_table_priviledge('ahoward',btrel,'update');
ERROR: Attribute 'btrel' not found
am i doing something completely stupid here?
-a
--
====================================
| Ara Howard
| NOAA Forecast Systems Laboratory
| Information and Technology Services
| Data Systems Group
| R/FST 325 Broadway
| Boulder, CO 80305-3328
| Email: ara.t.howard@fsl.noaa.gov
| Phone: 303-497-7238
| Fax: 303-497-7259
====================================
ahoward <ahoward@fsl.noaa.gov> writes:
> grib_tables=# select has_table_priviledge('ahoward','btrel','update');
> ERROR: Function 'has_table_priviledge(unknown, unknown, unknown)' does not exist
Right syntax, wrong function name --- there's no "d" in "privilege".
regards, tom lane
On Thu, 24 Apr 2003, Tom Lane wrote:
> ahoward <ahoward@fsl.noaa.gov> writes:
> > grib_tables=# select has_table_priviledge('ahoward','btrel','update');
> > ERROR: Function 'has_table_priviledge(unknown, unknown, unknown)' does not exist
>
> Right syntax, wrong function name --- there's no "d" in "privilege".
>
> regards, tom lane
;-)
long day... the error message sure wasn't helpfull though, i finally figured
that one out... any idea why this doesn't work?
create table vtrcs_co_l
(
relname text,
who name default current_user,
time timestamp(0) without time zone default current_timestamp,
primary key (relname),
foreign key (relname)
references btrel (relname),
constraint c0 check
(has_table_privilege(username, relname, 'update'))
);
it creates the table, but an insert of
insert into vtrcs_co_l values('parameter');
fails with
ERROR: text_oid: error in "parameter": can't parse "parameter"
which is very odd since
select has_table_privilege('parameter', current_user, current_timestamp);
does not. incidentally
insert into vtrcs_co_l values('parameter', current_user, current_timestamp);
fails as well with the same error.
thanks.
-a
--
====================================
| Ara Howard
| NOAA Forecast Systems Laboratory
| Information and Technology Services
| Data Systems Group
| R/FST 325 Broadway
| Boulder, CO 80305-3328
| Email: ara.t.howard@fsl.noaa.gov
| Phone: 303-497-7238
| Fax: 303-497-7259
====================================
ahoward <ahoward@fsl.noaa.gov> writes:
> insert into vtrcs_co_l values('parameter');
> fails with
> ERROR: text_oid: error in "parameter": can't parse "parameter"
Not here. As best I can reproduce your example (it doesn't work as
given, I'm assuming you meant "who" not "username") I get
regression=# insert into vtrcs_co_l values('parameter');
ERROR: Relation "parameter" does not exist
which is about what I'd expect ...
regards, tom lane
On Thu, 24 Apr 2003, Tom Lane wrote:
> ahoward <ahoward@fsl.noaa.gov> writes:
> > insert into vtrcs_co_l values('parameter');
> > fails with
> > ERROR: text_oid: error in "parameter": can't parse "parameter"
>
> Not here. As best I can reproduce your example (it doesn't work as
> given, I'm assuming you meant "who" not "username") I get
yes.
> regression=# insert into vtrcs_co_l values('parameter');
> ERROR: Relation "parameter" does not exist
>
> which is about what I'd expect ...
something still doesn't seem right... this is the simplest possible demo of the problem:
~ > cat advisory_lock.sql
create table advisory_lock
(
relname text,
constraint c check
(has_table_privilege(user, relname, 'update'))
);
insert into advisory_lock values ('pg_class');
~ > psql -f lock.sql
CREATE
psql:lock.sql:7: ERROR: text_oid: error in "pg_class": can't parse "pg_class"
shouldn't this work?
-a
--
====================================
| Ara Howard
| NOAA Forecast Systems Laboratory
| Information and Technology Services
| Data Systems Group
| R/FST 325 Broadway
| Boulder, CO 80305-3328
| Email: ara.t.howard@fsl.noaa.gov
| Phone: 303-497-7238
| Fax: 303-497-7259
====================================
ahoward <ahoward@fsl.noaa.gov> writes:
> create table advisory_lock
> (
> relname text,
> constraint c check
> (has_table_privilege(user, relname, 'update'))
> );
> insert into advisory_lock values ('pg_class');
> psql:lock.sql:7: ERROR: text_oid: error in "pg_class": can't parse "pg_class"
> shouldn't this work?
It does work, for me. What PG version are you using, exactly? How did
you build it? I see no problem using 7.3 branch tip (so it could be
that the problem is fixed by some post-7.3.2 patch, but I can't think
of any that might be relevant).
Can anyone else try this case?
regards, tom lane
On Thu, 24 Apr 2003, Tom Lane wrote:
> ahoward <ahoward@fsl.noaa.gov> writes:
> > create table advisory_lock
> > (
> > relname text,
> > constraint c check
> > (has_table_privilege(user, relname, 'update'))
> > );
> > insert into advisory_lock values ('pg_class');
>
> > psql:lock.sql:7: ERROR: text_oid: error in "pg_class": can't parse "pg_class"
>
> > shouldn't this work?
>
> It does work, for me. What PG version are you using, exactly? How did
> you build it? I see no problem using 7.3 branch tip (so it could be
> that the problem is fixed by some post-7.3.2 patch, but I can't think
> of any that might be relevant).
>
> Can anyone else try this case?
It seemed to work for me on a 7.3.1 machine I tried it on.
On Thu, 24 Apr 2003, Tom Lane wrote:
> ahoward <ahoward@fsl.noaa.gov> writes:
> > create table advisory_lock
> > (
> > relname text,
> > constraint c check
> > (has_table_privilege(user, relname, 'update'))
> > );
> > insert into advisory_lock values ('pg_class');
>
> > psql:lock.sql:7: ERROR: text_oid: error in "pg_class": can't parse "pg_class"
>
> > shouldn't this work?
>
> It does work, for me. What PG version are you using, exactly? How did
> you build it? I see no problem using 7.3 branch tip (so it could be
> that the problem is fixed by some post-7.3.2 patch, but I can't think
> of any that might be relevant).
version
-----------------------------------------------------------
PostgreSQL 7.2 on i686-pc-linux-gnu, compiled by GCC 2.96
(1 row)
it seems to work for me on 7.3.2 though...
strange.
-a
--
====================================
| Ara Howard
| NOAA Forecast Systems Laboratory
| Information and Technology Services
| Data Systems Group
| R/FST 325 Broadway
| Boulder, CO 80305-3328
| Email: ara.t.howard@fsl.noaa.gov
| Phone: 303-497-7238
| Fax: 303-497-7259
====================================
ahoward <ahoward@fsl.noaa.gov> writes:
> On Thu, 24 Apr 2003, Tom Lane wrote:
>> It does work, for me. What PG version are you using, exactly?
> PostgreSQL 7.2 on i686-pc-linux-gnu, compiled by GCC 2.96
Ah. I see it too on 7.2. It looks like the 7.2 parser is choosing
has_table_privilege(name, oid, text) in preference to
has_table_privilege(name, name, text). I can get it to work on 7.2 by
putting in an explicit cast, ie, making the constraint read
constraint c check
(has_table_privilege(user, relname::name, 'update'))
Probably the reason 7.3 doesn't misbehave is that its function is
declared has_table_privilege(name, text, text). That affects the
decision because 'text' is a preferred type and 'name' isn't.
regards, tom lane
On Thu, 24 Apr 2003, Tom Lane wrote: > Ah. I see it too on 7.2. It looks like the 7.2 parser is choosing > has_table_privilege(name, oid, text) in preference to > has_table_privilege(name, name, text). I can get it to work on 7.2 by > putting in an explicit cast, ie, making the constraint read > constraint c check > (has_table_privilege(user, relname::name, 'update')) thanks alot tom - that did it for me. i'm really glad to have that solved since i was otherwise going to have to do it at the application layer which felt hackish. in case you hadn't already guessed, i was putting together a advisory locking scheme for certain classes of tables (bi-temporal ones), such that transient processes could obtain a lock on one invocation, but release it in another. AFAIK there is no way to do this with the normal locking facilities since any lock expires when the transaction/session ends (guess you could have a lock daemon...). anyhow, this facility allows things like cgi's to carry locks across processes. seems like others would have come up against this problem before... > Probably the reason 7.3 doesn't misbehave is that its function is declared > has_table_privilege(name, text, text). That affects the decision because > 'text' is a preferred type and 'name' isn't. i'll upgrade ASAP. thanks again for the help. -a -- ==================================== | Ara Howard | NOAA Forecast Systems Laboratory | Information and Technology Services | Data Systems Group | R/FST 325 Broadway | Boulder, CO 80305-3328 | Email: ara.t.howard@fsl.noaa.gov | Phone: 303-497-7238 | Fax: 303-497-7259 ====================================