0

我已经使用gsec将用户添加到 Firebird 2.1 实例,但现在我想将所有表上的 SELECT 授予这个新用户。我可以找到如何在特定表上授予此权限,但不能全部授予:

GRANT SELECT ON TABLE table TO USER user;

如果我尝试使用新用户,我会在 isql 上收到以下错误:

没有对 TABLE表的读取/选择访问权限

有没有办法在 Firebird 2.1 上做到这一点?

4

2 回答 2

4

像这样的东西:

EXECUTE BLOCK
AS
  DECLARE VARIABLE tablename VARCHAR(32);
BEGIN
  FOR SELECT rdb$relation_name
  FROM rdb$relations
  WHERE rdb$view_blr IS NULL
  AND (rdb$system_flag IS NULL OR rdb$system_flag = 0)
  INTO :tablename DO
  BEGIN
    EXECUTE STATEMENT ('GRANT SELECT ON TABLE ' || :tablename || ' TO USER TEST');
  END
END
于 2017-08-02T09:07:17.857 回答
1

我可以找到如何在特定表上授予此权限,但不是全部授予

您可以将特定权限授予所有已存在但尚未创建的用户。这是通过授予“PUBLIC”伪用户权限来实现的。或者您可以授予 some 特权ROLE,然后将其授予ROLE给定用户,然后在数据库连接期间指定选项,用户ROLE在此会话中模拟 this。

但是,没有语法可以授予所有生成器或所有过程或所有视图或所有表等权限。

请参阅GRANT文档中的语句语法。

但是,您可以做的是创建一个简单的脚本(匿名和易失性又名EXECUTE BLOCK或持久性并命名为STORED PROCEDURE),并且您的脚本将查询系统表以列出所有非系统(COALESCE(RDB$SYSTEM_FLAG,0)=0)表(连同视图或表,但不包括视图:检查RDB$RELATION_TYPE是 0 还是 0 或 1)然后形成一个GRANT语句序列并一个一个地执行它们。

请参阅有关EXECUTE BLOCKand FOR SELECT ... INTO ... DO ...and EXECUTE STATEMENT( 或者可能FOR EXECUTE STATEMENT还有文档,但我认为它已经存在于 FB 2.1 中。有非官方的 wiki 跟踪哪些语句从哪个 FB 版本开始可用,但它并不彻底并且可能包含错误:http:/ /firebirdsql.su/doku.php )。

于 2017-08-02T08:40:28.187 回答