如何授权使用生成器语法
How to grant usage on generator syntax
我通常不是使用 Firebird 语言的人,但我必须修复对生成器的访问才能继续工作。我的脚本中有一行:set generator order_gen to 0
不再有效。
我正在尝试:GRANT USAGE ON GENERATOR ORDER_GEN TO USER MAHE
,但我仍然收到错误 ...no permission for ALTER access to GENERATOR ORDER_GEN ...
。
我应该授予不同的权限才能设置生成器,还是我没有使用正确的语法?
假设 Firebird 3.0 或更高版本,USAGE
权限仅授予使用 NEXT VALUE FOR <sequence>
和 GEN_ID(<sequence>, <n>)
的权限。如documentation中所述:
For sequences (generators), the USAGE
privilege only grants the
right to increment the sequence using the GEN_ID
function or NEXT VALUE FOR
. The SET GENERATOR
statement is a synonym for ALTER SEQUENCE … RESTART WITH …
, and is considered a DDL statement. By
default, only the owner of the sequence and administrators have the
rights to such operations. The right to set the initial value of any
sequence can be granted with GRANT ALTER ANY SEQUENCE
, which is not
recommend for general users.
如前所述,GRANT ALTER ANY SEQUENCE
应该是最后的手段。根据要解决的实际问题,您还可以调用 gen_id(order_gen, 0 - gen_id(order_gen, 0))
(例如 select gen_id(order_gen, 0 - gen_id(order_gen, 0)) from rdb$database
)(这是一个 loophole/workaround,另请参阅 Firebird 问题中的 Inconsistency between ALTER and USAGE privileges for sequences (generators).追踪器)。
或者,您应该要求您的数据库管理员执行此 script/statement,或者 - 如果您自己拥有 RDB$ADMIN 权限 - 以确保在连接到数据库时指定该角色(如果您不如果不明确指定角色,您将无法获得管理员权限。
我通常不是使用 Firebird 语言的人,但我必须修复对生成器的访问才能继续工作。我的脚本中有一行:set generator order_gen to 0
不再有效。
我正在尝试:GRANT USAGE ON GENERATOR ORDER_GEN TO USER MAHE
,但我仍然收到错误 ...no permission for ALTER access to GENERATOR ORDER_GEN ...
。
我应该授予不同的权限才能设置生成器,还是我没有使用正确的语法?
假设 Firebird 3.0 或更高版本,USAGE
权限仅授予使用 NEXT VALUE FOR <sequence>
和 GEN_ID(<sequence>, <n>)
的权限。如documentation中所述:
For sequences (generators), the
USAGE
privilege only grants the right to increment the sequence using theGEN_ID
function orNEXT VALUE FOR
. TheSET GENERATOR
statement is a synonym forALTER SEQUENCE … RESTART WITH …
, and is considered a DDL statement. By default, only the owner of the sequence and administrators have the rights to such operations. The right to set the initial value of any sequence can be granted withGRANT ALTER ANY SEQUENCE
, which is not recommend for general users.
如前所述,GRANT ALTER ANY SEQUENCE
应该是最后的手段。根据要解决的实际问题,您还可以调用 gen_id(order_gen, 0 - gen_id(order_gen, 0))
(例如 select gen_id(order_gen, 0 - gen_id(order_gen, 0)) from rdb$database
)(这是一个 loophole/workaround,另请参阅 Firebird 问题中的 Inconsistency between ALTER and USAGE privileges for sequences (generators).追踪器)。
或者,您应该要求您的数据库管理员执行此 script/statement,或者 - 如果您自己拥有 RDB$ADMIN 权限 - 以确保在连接到数据库时指定该角色(如果您不如果不明确指定角色,您将无法获得管理员权限。