2017-09-08 75 views
0

我正在從MariaDB切換到Postgres,並遇到一些意外問題。無法通過PHP PDO訪問Postgresql數據庫

我在Ubuntu 16.04.4上安裝了Postgres 9.5.8。

從貝,我然後執行以下操作

su postgres 
psql 
password: //enter postgres password assigned at installation 
CREATE USER test; 
CREATE ROLE //psql response 
CREATE DATABASE test; 
CREATE DATABASE //psql response 
ALTER USER test WITH ENCRYPTED PASSWORD 'password'; 
ALTER ROLE //psql response 
GRANT ALL PRIVILEGES ON DATABASE test TO test; 
GRANT //psql response 

在運行PHP 7.0.22我瞭解它們對Adminer 4.3.1作爲root用戶我的Nginx服務器1.10.3(Postgres的),並創建數據庫表「test」

CREATE TABLE "public"."test" (
"a" smallint NOT NULL, 
"b" integer NOT NULL, 
"c" bigint NOT NULL, 
"d" boolean NOT NULL, 
"e" double precision NOT NULL, 
"f" date NOT NULL, 
"g" character varying(1024) NOT NULL, 
"id" integer NOT NULL 
) WITH (oids = false); 

INSERT INTO "test" ("a","b","c","d","e","f","g","id") 
VALUES (1,2,3,'1',4.5,'2017-08-22','testing',1); 

它按照預期創建表「測試」。

做完這一切,然後我寫了一個簡單的PHP腳本

<?php 
$dsn = "pgsql:host=localhost;port=5432;". 
     "dbname=test;user=test;password=password"; 
$dbh = new PDO($dsn); 

try 
{ 
    $count = $dbh->query("SELECT COUNT(*) FROM test")->fetchColumn(); 
} catch (Exception $e){echo $e->getMessage();} 
echo "Count = $count"; 
?> 

當我運行此腳本我找回了錯誤

SQLSTATE[42501]: Insufficient privilege: 7 ERROR: permission denied for 
relation test 

這似乎表明,GRANT ALL PRIVILEGES ON DATABASE test TO test;是不夠的授予用戶test所有必要的權限以執行我在此嘗試執行的操作。

我在這裏錯過了什麼?

回答

0

我剛剛刪除了這個問題,但後來認爲如果我用正確的答案將它留在那裏可能對社區更有用。

這裏的一個簡單事實就是 - 當用戶登錄時通過Adminer創建的表,即用戶,即postgres,將由該用戶所有。如果您之後通過PHP PDO作爲另一個用戶進入,您可能會遇到難以操縱該表的情況! 「解決方案」很簡單 - 只要確保您以同樣的用戶身份登錄到Adminer,並最終通過PDO操作數據庫。

我正在從MariaDB切換到Postgres的過程解釋了爲什麼我遇到了這個問題 - MariaDB/MySQL不會對錶擁有權和可訪問性強加這樣的限制。但是,儘管如此,作爲root用戶登錄Adminer可能只是一個壞習慣。