在Java DB(Derby)中创建的数据库设置如下,以允许身份验证和授权:
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.connection.requireAuthentication','true');
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.user.normal', 'normal');
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.fullAccessUsers', 'sa');
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.readOnlyAccessUsers', 'normal');
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.defaultConnectionMode', 'readOnlyAccess');
“sa”用户名是在数据库创建期间创建的,因此它是数据库的所有者。
这是按预期工作的。我可以以“sa”用户身份登录并拥有完全访问权限。或者以“普通”用户身份登录,并限制为只读访问权限。
现在,我想使用SQL授权向特定用户授予特定权限。 为此,我必须首先通过执行以下命令来启用SQL授权:
CALL SYSCS_UTIL.SYSCS_SET_DATABASE_PROPERTY('derby.database.sqlAuthorization', 'true');
问题是,在“sa”下再次登录后,系统报告我没有SELECT和其他语句的权限。此外,我放弃了对数据库的完全所有权。
为什么Derby在执行启用SQL授权的语句后突然拒绝访问包括所有者在内的任何用户?
P.S。我使用Apache Derby Network Server - 10.9.1.0,它是NetBeans 7.3的Java EE 7安装的一部分
P.S 2.在SQL授权设置为true后,我尝试使用以下SQL错误代码收到的GRANT语句:
SQL state 42506: User 'SA' is not the owner of Table/View 'SA'.'DOCTYPES'.
即使整个数据库是使用此用户名创建的。