2017-08-01 37 views
0

我已經使用gsec將用戶添加到了Firebird 2.1實例,但現在我想將所有表的SELECT授予此新用戶。我能找到如何授予對特定表此權限,而不是將它們全部:在Firebird 2.1中向用戶授予對所有表的SELECT選擇

GRANT SELECT ON TABLE table TO USER user; 

如果我嘗試使用新的用戶我得到ISQL以下錯誤:

沒有許可讀取/選擇訪問表

有沒有辦法在Firebird 2.1上做到這一點?

+0

你執行正確的數據庫授權,請說明次確切的步驟,因爲這應該工作。 –

+0

@MarkRotteveel我想知道他是否提交了這些贈款並重新啓動提取交易,也許可能是交叉交易。 –

回答

0

事情是這樣的:

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

1

我能找到如何授予對特定表此權限,而不是將它們全部

您可以具體權限授予所有用戶,已經存在的和尚未建立。這是通過授予「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不是很多,但「好於無」 –

相關問題