[
https://issues.apache.org/jira/browse/DERBY-4156?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Rick Hillegas closed DERBY-4156.
--------------------------------
Resolution: Invalid
Hi Tiago,
This behavior is decidely weird, but it is expected. What you have run across
is another symptom of Derby's lack of user management. This particular issue is
discussed in section 6.2 of the functional spec attached to the master roles
issue, DERBY-2207. You have tripped across one of the speedbumps at the
intersection of two awkward facts:
1) The ANSI/ISO GRANT/REVOKE language does not distinguish the rolename and
username spaces. Role names and user names live in a single, conflated
namespace called "authorization ids". So, just looking at a GRANT/REVOKE
statement, you can't tell whether it wants to operate on a role or a user.
2) Derby's flexible authentication scheme does not give you any foolproof way
to figure out if an authorization id is the name of an existing user.
Here's what's going on in your problem case:
1) Derby interprets your "grant update on t1 to testWithoutCreate" statement as
a privilege GRANT to a user named TESTWITHOUTCREATE. At this time, Derby
creates a permission tuple to record this GRANT.
2) When you then try to create a role named TESTWITHOUTCREATE, Derby looks to
see if there will be any collisions with that authorization id. Derby sees that
a permission has already been granted to that authorization id so that
authorization id is not available as the name of a new role.
> SQL Roles - Granting privileges to a role before creating it generates weird
> behavior
> -------------------------------------------------------------------------------------
>
> Key: DERBY-4156
> URL: https://issues.apache.org/jira/browse/DERBY-4156
> Project: Derby
> Issue Type: Bug
> Components: SQL
> Affects Versions: 10.5.1.0
> Environment: - Windows Vista x64
> - Sun Java 6
> Reporter: Tiago R. Espinha
> Attachments: derby.properties
>
>
> While doing the buddy testing for the SQL roles, I believe I have found a bug.
> Reproduction:
> ij> connect
> 'jdbc:derby://localhost:1527/testro;user=tiago2;password=alentejo;create=true';
> ij> create table t1 (f1 int, f2 varchar(200));
> 0 rows inserted/updated/deleted
> ij> create role testCreateFirst;
> 0 rows inserted/updated/deleted
> ij> grant select on t1 to testCreateFirst;
> 0 rows inserted/updated/deleted
> ij> grant testCreateFirst to tiago;
> 0 rows inserted/updated/deleted
> ij> grant update on t1 to testWithoutCreate;
> 0 rows inserted/updated/deleted
> ij> grant testWithoutCreate to adm;
> ERROR 0P000: Invalid role specification, role does not exist:
> 'TESTWITHOUTCREATE'.
> ij> create role testWithoutCreate;
> ERROR X0Y68: User 'TESTWITHOUTCREATE' already exists.
> ---------------------8<----------------------
> This reproduction was made on a freshly created database. Basically I created
> the table, then created a role and gave it SELECT privileges on that table.
> Finally I granted the said role to a user (I'm using built-in authentication)
> and it all went smoothly.
> The problem came when I accidentally forgot to create a role and proceeded to
> grant privileges to that role. So when we grant some privilege to a
> non-existing role, instead of getting an error it all seems to go fine. It is
> when we try to grant this role to a user that we are told that the role does
> not exist, which makes sense. Still, when I try to create that role
> afterwards, I get an error message saying that an ->user<- with this username
> already exists.
> Granting privileges to a non-existing role should issue an error and instead
> it is probably causing some havoc in the database.
--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.