Thread: [SQL] Delete failing with -- permission denied

[SQL] Delete failing with -- permission denied

From
anand086
Date:
Delete from table test.entities_all is failing with "permission denied for
relation". The table from which row has to be deleted, is referenced by
another table "attribute_types" with ON DELETE CASCADE.

I tried deleting the row from attribute_types table and then deleting from
test.entities_all succeed.

I am not able to understand why this delete sql is failing.

######################
Delete from table is failing with 
######################

user_test@testdbpg # delete from test.entities_all where entity_type_id =
254 AND entity_id = 20043093223;
ERROR:  permission denied for relation current_change$tmp
CONTEXT:  PL/pgSQL function test.current_change() line 11 at RETURN QUERY
SQL statement "SELECT       change_num                                          FROM test.current_change"
PL/pgSQL function test."changes_package$get_change_num"() line 5 at SQL
statement
PL/pgSQL function test."attribute_types_history$attribute_types"() line 6 at
assignment
SQL statement "DELETE FROM ONLY "test"."attribute_types" WHERE $1
OPERATOR(pg_catalog.=) "attribute_type_entity_id""
Time: 65.536 ms

#############################
Table test.entities_all has below 
#############################

Referenced by:   TABLE "test.entities_all" CONSTRAINT "entities_all_fk2" FOREIGN KEY
(owner_id) REFERENCES test.entities_all(entity_id) ON DELETE SET NULL   TABLE "test.attribute_types" CONSTRAINT
"fkey_at_attribute_entity"
FOREIGN KEY (attribute_type_entity_id) REFERENCES
test.entities_all(entity_id) ON DELETE CASCADE   TABLE "test.requests" CONSTRAINT "requests_fk2" FOREIGN KEY
(requester_entity_id) REFERENCES test.entities_all(entity_id) ON DELETE
CASCADE

#######################################
Table test.attribute_types has
#######################################

Referenced by:   TABLE "test.attributes" CONSTRAINT "fkey_attribute_type" FOREIGN KEY
(attribute_type_id) REFERENCES test.attribute_types(attribute_type_id)

###############################
Deleting each row manually 
###############################

user_test@testdbpg #begin;
BEGIN
Time: 21.895 ms
user_test@testdbpg # delete from test.attributes where
(attribute_type_id)=(1220010);
DELETE 1
Time: 24.145 ms
user_test@testdbpg # DELETE FROM ONLY "test"."attribute_types" where
(attribute_type_id)=(1220010);
DELETE 1
Time: 35.638 ms
user_test@testdbpg # delete from test.entities_all where  ( entity_type_id =
254::INTEGER AND entity_id = 20043093223::NUMERIC);
DELETE 1
Time: 56.104 ms
user_test@testdbpg # rollback;
ROLLBACK
Time: 28.266 ms
user_test@testdbpg #


###############################
Function
##############################

CREATE OR REPLACE FUNCTION test."attribute_types_history$attribute_types"()RETURNS triggerLANGUAGE plpgsql
AS $function$
DECLARE   new_change_num numeric;
BEGIN   PERFORM test.changes_package$init();   new_change_num := test.changes_package$get_change_num();   INSERT INTO
test.attribute_types_history(attribute_type_id,
 
for_entity_type_id, attribute_name, attribute_description,
attribute_type_entity_id, last_modified_by, last_modified_date,
creation_change_num, deletion_change_num)   VALUES (OLD.attribute_type_id, OLD.for_entity_type_id,
OLD.attribute_name, OLD.attribute_description, OLD.attribute_type_entity_id,
OLD.last_modified_by, OLD.last_modified_date, OLD.creation_change_num,
new_change_num);   RETURN OLD;
END;
$function$


######################################################
Able to select from changes_package$get_change_num
######################################################

user_test@testdbpg # select * from test.changes_package$get_change_num();
+--------------------------------+
| changes_package$get_change_num |
+--------------------------------+
|                      100759111 |
+--------------------------------+
(1 row)

Time: 27.829 ms



--
View this message in context: http://www.postgresql-archive.org/Delete-failing-with-permission-denied-tp5964882.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.



Re: [SQL] Delete failing with -- permission denied

From
Tom Lane
Date:
anand086 <anand086@gmail.com> writes:
> Delete from table test.entities_all is failing with "permission denied for
> relation". The table from which row has to be deleted, is referenced by
> another table "attribute_types" with ON DELETE CASCADE.

> I tried deleting the row from attribute_types table and then deleting from
> test.entities_all succeed.

Probably you have permissions to do such deletion, but the owner of the
entities_all table does not.  FK CASCADE queries are run as the owner
of the table in question.
        regards, tom lane



Re: [SQL] Delete failing with -- permission denied

From
anand086
Date:
Thank you Tom for your quick reply.


"FK CASCADE queries are run as the owner of the table in question."

All the table belong to TEST and application user is user_test. Below grants
were granted to "user_test"

GRANT ALL PRIVILEGES ON ALL TABLES IN schema "test"  TO user_test;
grant usage on schema "test" to user_test;

What would be needed to rectify the issue?






--
View this message in context:
http://www.postgresql-archive.org/Delete-failing-with-permission-denied-tp5964882p5964888.html
Sent from the PostgreSQL - sql mailing list archive at Nabble.com.



Re: [SQL] Delete failing with -- permission denied

From
"David G. Johnston"
Date:
On Mon, Jun 5, 2017 at 2:34 PM, anand086 <anand086@gmail.com> wrote:
What would be needed to rectify the issue?

​IMO you need to supply a self-contained script that goes from nothing to problem.​  I say this particularly since the only place the relation name "current_change$tmp" appears in your email is in the error message.

David J.

Re: [SQL] Delete failing with -- permission denied

From
Adrian Klaver
Date:
On 06/05/2017 01:44 PM, anand086 wrote:
> Delete from table test.entities_all is failing with "permission denied for
> relation". The table from which row has to be deleted, is referenced by
> another table "attribute_types" with ON DELETE CASCADE.
> 
> I tried deleting the row from attribute_types table and then deleting from
> test.entities_all succeed.
> 
> I am not able to understand why this delete sql is failing.
> 
> ######################
> Delete from table is failing with
> ######################
> 
> user_test@testdbpg # delete from test.entities_all where entity_type_id =
> 254 AND entity_id = 20043093223;
> ERROR:  permission denied for relation current_change$tmp
> CONTEXT:  PL/pgSQL function test.current_change() line 11 at RETURN QUERY
> SQL statement "SELECT
>          change_num
>                                             FROM test.current_change"
> PL/pgSQL function test."changes_package$get_change_num"() line 5 at SQL
> statement
> PL/pgSQL function test."attribute_types_history$attribute_types"() line 6 at
> assignment
> SQL statement "DELETE FROM ONLY "test"."attribute_types" WHERE $1
> OPERATOR(pg_catalog.=) "attribute_type_entity_id""
> Time: 65.536 ms

You seem to have a chain of triggers/functions on this table. It would 
be nice to see how those cascade. In particular from above:

PL/pgSQL function test."attribute_types_history$attribute_types"() line 6 at
assignment
SQL statement "DELETE FROM ONLY "test"."attribute_types" WHERE $1
OPERATOR(pg_catalog.=) "attribute_type_entity_id""

which leads me to believe this is the problem:

CREATE OR REPLACE FUNCTION test."attribute_types_history$attribute_types"()

...

new_change_num := test.changes_package$get_change_num();

...

which then leads to what is in test.changes_package$get_change_num(), 
though I suspect it includes:

SQL statement "DELETE FROM ONLY "test"."attribute_types" WHERE $1
OPERATOR(pg_catalog.=) "attribute_type_entity_id""

Also would be nice to know what user(s) the functions are running as?



-- 
Adrian Klaver
adrian.klaver@aklaver.com