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

问题描述:

我已经使用gsec将用户添加到了Firebird 2.1实例,但现在我想将所有表的SELECT授予此新用户。我能找到如何授予对特定表此权限,而不是将它们全部:在Firebird 2.1中向用户授予对所有表的SELECT选择

GRANT SELECT ON TABLE table TO USER user; 

如果我尝试使用新的用户我得到ISQL以下错误:

没有许可读取/选择访问表

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

+0

你执行正确的数据库授权,请说明次确切的步骤,因为这应该工作。 –

+0

@MarkRotteveel我想知道他是否提交了这些赠款并重新启动提取交易,也许可能是交叉交易。 –

事情是这样的:

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 
+0

如果你检查查看源,然后检查“RDB $ EXTERNAL_FILE”。但最好只是检查'RDB $ RELATION_TYPE = 0'///接下来的事情就是枚举所有用户,如果我们不想全部授予'PUBLIC' :-) –

+0

好吧,为了我。我认为这将有一个简单的方法就像在MySQL上,但我想我错了。谢谢! – Bruno

我能找到如何授予对特定表此权限,而不是将它们全部

您可以具体权限授予所有用户,已经存在的和尚未建立。这是通过授予“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有哪些语句是可利用的,因为这FB版本的非官方的wiki跟踪,但它是不彻底并可能包含错误:http://firebirdsql.su/doku.php)。

+0

链接到俄语网站是不是真的有用的国际海事组织。 –

+0

@MarkRotteveel如果在英文中有这样的每个版本的wiki ....没有。虽然检查版本表不需要知道俄罗斯。如果读者好奇,他有www.translate.ru不是很多,但“好于无” –