![](/img/trans.png)
[英]Postgresql Foreign data wrapper error Non-superuser cannot connect if the server does not request a password
[英]Non-superuser cannot connect if the server does not request a password while using dblink
我想在我的應用程序中做一些跨數據庫引用。 簡而言之,我有兩個名為 meta 和 op 的數據庫。 我想從 meta 到 op 數據庫中的表進行一些選擇查詢,如下所示,但出現以下錯誤。 我嘗試使用密碼和不使用密碼。 順便說一句, caixa
用戶是非超級用戶,我的目標服務器( op
db 服務器具有 MD5 身份驗證模式。)
meta=> select * from dblink('dbname=op password=caixa','SELECT op_col from op_table') AS t(op_col varchar);
錯誤:需要密碼
詳細信息:如果服務器不請求密碼,則非超級用戶無法連接。
提示:必須更改目標服務器的身份驗證方法。
上述錯誤消息中的 HINT 暗示了什么? 我需要更改服務器的身份驗證模式嗎? 在不更改服務器的身份驗證模式 (MD5) 的情況下,我不能運行上述查詢嗎?
從文檔:
只有超級用戶可以使用 dblink_connect 創建非密碼認證的連接。 如果非超級用戶需要此功能,請改用dblink_connect_u 。
和
dblink_connect_u() 與 dblink_connect() 相同,只是它允許非超級用戶使用任何身份驗證方法進行連接。
這意味着您的dblink
調用正在隱式使用dblink_connect
。 請改用dblink_connect_u
或將您的身份驗證方法更改為例如 md5。
請注意,您還需要向caixa
角色授予執行權限,例如:
GRANT EXECUTE ON FUNCTION dblink_connect_u(text) TO caixa;
GRANT EXECUTE ON FUNCTION dblink_connect_u(text, text) TO caixa;
工作示例(在GRANT
之后):
meta=> SELECT dblink_connect_u('conn1', 'dbname=op');
meta=> SELECT * FROM dblink('conn1','SELECT op_col from op_table')
AS t(op_col varchar);
op_col
--------
aaa
bbb
ccc
(3 rows)
meta=> SELECT dblink_disconnect('conn1');
編輯:
抱歉,回答有點誤導。 當然,md5 認證連接不需要dblink_connect_u
。 我看到了一種可能性。 PostgreSQL 有兩種不同的連接類型:主機和本地。
跑步:
psql -h localhost..
包含主機連接,但
dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
使用本地類型,因此如果您有本地連接的非密碼方法(例如 ident 方法或 trust),則返回
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server's authentication method must be changed.
查看
dblink_connect('mycon','hostaddr=127.0.0.1 dbname=vchitta_op user=caixa password=caixa')
用於主機連接。 為了清楚起見,請發布您的pg_hba.conf
。
我還檢查了vchitta_op
DB 上的CONNECT
權限,但錯誤消息不同:
REVOKE CONNECT ON DATABASE vchitta_op FROM PUBLIC;
REVOKE CONNECT ON DATABASE vchitta_op FROM caixa;
SELECT dblink_connect('mycon','dbname=vchitta_op user=caixa password=caixa');
ERROR: could not establish connection
DETAIL: FATAL: permission denied for database "vchitta_op"
DETAIL: User does not have CONNECT privilege.
有一種解決方法對我有用。 如果設置了“SECURITY DEFINER”選項,非超級用戶可以使用超級用戶的權限執行功能。 ( http://www.postgresql.org/docs/9.1/static/sql-createfunction.html )
這意味着您可以創建一個 function(具有超級用戶所有者和 SECURITY DEFINER 選項)進行跨數據庫操作(使用dblink()沒有密碼)並在非超級用戶下執行它
我有一個類似但不同的問題。 我有兩台具有相同 postgres.conf 和 pg_hba.conf 的服務器。 但是,一個在 9.2.3 版本上,一個在 9.2.4 上
pg_hba.conf 有
local all dblinkuser trust
然后我使用任何普通用戶連接到數據庫
theater_map=# select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
dblink_connect
----------------
OK
(1 row)
我的 pg_hba.conf 具有與上面相同的條目
theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server's authentication method must be changed.
現在我在 9.2.4 上更改我的 pg_hba.conf 如下
local all dblinkuser md5
並重新啟動 postgres
theater_map=> select dblink_connect('dbname=TheaterDB user=dblinkuser password=dbl123');
dblink_connect
----------------
OK
(1 row)
我檢查了版本 9.2.3 和 9.2.4 之間的更改日志,但找不到任何詳細信息。
注意:在 9.2.3 上將身份驗證方法從 trust 更改為 md5 沒有任何區別,並且仍然有效。
盡管我使用 fdw 擴展而不是 db_link,但我發現這個問題在谷歌上搜索相同的錯誤消息。 以下步驟有助於解決我的問題:
alter user myuser with password 'mypassword'
trust
並將其設置為md5
- vim /var/lib/postgresql/data_/pg_hba.conf
pg_hba.conf
- SELECT pg_reload_conf();
從 psql (注銷並登錄以驗證密碼是必需的)CREATE USER MAPPING FOR CURRENT_USER SERVER myserver OPTIONS (user 'myuser', password 'mypassword');
PostgreSQL 11.10
SELECT ext.column1 from
dblink('hostaddr=192.192.192.192 dbname=yourDbname user=yourUsername password=yourpass',
'select a."column1" from "Table1" a where a."column2"=2')
as ext(column1 text)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.