在Firebird 2.1

时间:2017-08-01 18:46:23

标签: select firebird grant firebird2.1

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

GRANT SELECT ON TABLE table TO USER user;

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

  

没有读取/选择访问TABLE

的权限

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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

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

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

请参阅有关GRANTEXECUTE BLOCK以及FOR SELECT ... INTO ... DO ...(或者EXECUTE STATEMENT的文档,但我认为它不存在于FB 2.1中。有非官方的wiki跟踪自FB版本以来哪些语句可用,但它不彻底,可能包含错误:http://firebirdsql.su/doku.php)。

答案 1 :(得分:1)

这样的事情:

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