在 Firebird 2.1 中向用户授予所有表的 SELECT

Granting SELECT on all tables to a user in Firebird 2.1

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

GRANT SELECT ON TABLE table TO USER user;

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

no permission for read/select access to TABLE table

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

I could find how to grant this permission on specific tables, but not to them all

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

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

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

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

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

像这样:

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