[ 
https://issues.apache.org/jira/browse/DERBY-6429?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13844457#comment-13844457
 ] 

Rick Hillegas commented on DERBY-6429:
--------------------------------------

Here are my thoughts about how foreign keys, generated columns, check 
constraints, and triggers affect the permissions needed to execute an UPDATE 
statement. Does anyone have a different opinion?

Thanks,
-Rick

-----------------------------------------

Foreign Keys

Permissions for foreign keys are checked when the foreign key is declared. The 
owner of the foreign table must have REFERENCES privilege on the referenced 
columns in the primary key table. See part 2, section 11.8 (referential 
constraint definition), access rule 1. No further permissions checking is 
required at execution time. I do not see any language indicating that foreign 
keys become invalid or un-runnable if the owner of the foreign table later 
loses REFERENCES privilege on the referenced columns. I do not see any 
indication that the user issuing the UPDATE statement is required to have 
SELECT privilege on the referenced columns.


-----------------------------------------

Generated Columns

There are two kinds of permissions related to generation clauses:

G1) SELECT permission on the columns mentioned in the generation clause. I do 
not see any language in the Standard suggesting that you need explicit SELECT 
permission on all of the columns mentioned by the generation clause. That 
permission seems to be implied by the INSERT privilege you enjoy  on the table 
and the UPDATE privilege you may enjoy on a column mentioned by the generation 
clause.

G2) EXECUTE permission on functions invoked by the generation clause. This is 
addressed by part 2, section 4.28.3 (Execution of SQL-invoked routines). The 
user executing the UPDATE statement must enjoy EXECUTE permission on the 
functions invoked by the generation clause if the generation clause is run as a 
consequence of UPDATing a column.


-----------------------------------------

Check Constraints

Similarly, there are two kinds of permissions related to CHECK constraints:

C1) SELECT permission on the columns mentioned in the CHECK constraint. I do 
not see any language in the Standard suggesting that you need explicit SELECT 
permission on all of the columns mentioned by the CHECK constraint. That 
permission seems to be implied by the INSERT privilege you enjoy  on the table 
and the UPDATE privilege you may enjoy on a column mentioned by the CHECK 
constraint.

C2) EXECUTE permission on functions invoked by the CHECK constraint. This is 
addressed by part 2, section 4.28.3 (Execution of SQL-invoked routines). The 
user executing the UPDATE statement must enjoy EXECUTE permission on the 
functions invoked by the CHECK constraint.


-----------------------------------------

Triggers

There are two kinds of permissions related to triggers:

T1) The permission to SELECT columns from the source table in order to 
construct transition variables and transition tables. These permissions are 
described by part 2 of the Standard, section 11.49 (trigger definition), access 
rule 3. In order to declare a trigger, the trigger owner must have SELECT 
privilege on the whole source table if the trigger has transition variables or 
tables. It is my understanding that the SELECTion of source columns at runtime 
happens under the original aegis of the trigger owner. Moreover, I don't see 
any language suggesting that the trigger becomes un-runnable if the trigger 
owner later loses TRIGGER and/or SELECT privilege on the source table. 

T2) The permission to execute the trigger action. I can't find any language 
specifying special treatment of permissions for the trigger action. I believe 
that the trigger action runs with the privileges of the user who invoked the 
original, triggering INSERT/UPDATE/DELETE.


> Privilege checks for UPDATE statements are wrong.
> -------------------------------------------------
>
>                 Key: DERBY-6429
>                 URL: https://issues.apache.org/jira/browse/DERBY-6429
>             Project: Derby
>          Issue Type: Bug
>          Components: SQL
>    Affects Versions: 10.11.0.0
>            Reporter: Rick Hillegas
>
> UPDATE statements confuse SELECT and UPDATE privileges. Consider the 
> following SET clause:
>    SET updateColumn = selectColumn
> According to part 2 of the 2011 edition of the SQL Standard, that SET clause 
> requires the following privileges:
> 1) UPDATE privilege on updateColumn. Privileges for the left side of a SET 
> clause are described by section 14.14 (update statement: searched), access 
> rule 1b.
> 2) SELECT privilege on selectColumn. Privileges for the right side of a SET 
> clause are described by section 14.15 (set clause list) and the various 
> productions underneath value expression. In this case, we have a column 
> reference, whose privileges are governed by section 6.7 (column reference), 
> access rule 2.
> However, Derby requires the following:
> 1') UPDATE privilege on both updateColumn and selectColumn
> When we address this bug, we should make corresponding changes to the MERGE 
> statement.
> The following script shows the current behavior:
> connect 'jdbc:derby:memory:db;user=test_dbo;create=true';
> call syscs_util.syscs_create_user( 'TEST_DBO', 'test_dbopassword' );
> call syscs_util.syscs_create_user( 'RUTH', 'ruthpassword' );
> connect 'jdbc:derby:memory:db;shutdown=true';
> connect 'jdbc:derby:memory:db;user=test_dbo;password=test_dbopassword' as dbo;
> create table t1_025
> (
>     a int primary key,
>     updateColumn int,
>     selectColumn int,
>     privateColumn int
> );
> grant update ( updateColumn ) on t1_025 to ruth;
> grant select ( selectColumn ) on t1_025 to ruth;
> insert into t1_025 values ( 1, 100, 1000, 10000 );
> connect 'jdbc:derby:memory:db;user=ruth;password=ruthpassword' as ruth;
> -- correctly succeeds because ruth has UPDATE privilege on updateColumn
> update test_dbo.t1_025 set updateColumn = 17;
> -- the error message incorrectly states that the missing privilege
> -- is UPDATE privilege on privateColumn
> update test_dbo.t1_025 set updateColumn = privateColumn;
> -- incorrectly fails.
> -- ruth does have UPDATE privilege on updateColumn
> -- and SELECT privilege on selectColumn, which should be good enough.
> -- however, the error message incorrectly states that the missing privilege
> -- is UPDATE privilege on selectColumn.
> update test_dbo.t1_025 set updateColumn = selectColumn;
> -- incorrectly succeeds even though ruth does not have SELECT privilege on 
> updateColumn
> update test_dbo.t1_025 set updateColumn = 2 * updateColumn;
> set connection dbo;
> select * from t1_025 order by a;



--
This message was sent by Atlassian JIRA
(v6.1.4#6159)

Reply via email to