2015-05-29 25 views
2

由于在共享主机环境中MySQL的全文本功能的限制(最小字长不能改变),我正在考虑从MySQL切换到PostgreSQL。我没有PostgreSQL的管理经验,并且很难理解授予用户/角色的权限。如何授予PostgreSQL表的有限权限?

我的应用程序有两个用户,一个用于构建,一个用于运行时。我想在运行时用户只需有这些烫发:

SELECT, INSERT, UPDATE, DELETE 

因此我登录到PostgreSQL的这样:

sudo -u postgres psql postgres 

经咨询手册和各种互联网资源,我创造了这个演示,与意向对所有未来的表格拥有有限的权限。从一个完全全新的数据库:

CREATE USER job_frontend PASSWORD 'password'; 
DROP DATABASE IF EXISTS job_frontend; 
CREATE DATABASE job_frontend ENCODING 'UTF8'; 
CREATE ROLE job_runtime; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO job_runtime; 
GRANT job_runtime TO job_frontend; 

我的策略,这可能是我要去的地方错了:创建一个用户,在角色设置补助,然后分配角色授予给用户。我是否需要从数据库中删除一些默认权限?在MySQL中,用户默认情况下没有权限,并且可能在这种思维模式下被卡住了。

然后我用PDO/PHP尝试各种操作(当然我修改prepare()运行我想要的项目:

<?php 

$dsn = 'pgsql:dbname=job_frontend;host=localhost;user=job_frontend;password=password'; 
$db = new PDO($dsn); 

// These should succeed 
$sqlRead = "SELECT * FROM x"; 
$sqlWrite = "INSERT INTO x (id) VALUES (1)"; 

// This should fail but in fact succeeds 
$sqlCreate = "CREATE TABLE x (id INTEGER)"; 

$stmt = $db->prepare($sqlRead); 
if ($stmt === false) 
{ 
    print_r($db->errorInfo()); 
} 

$stmt->execute(); 
echo "Count: " . $stmt->rowCount() . "\n"; 

if ($rows = $stmt->fetchAll(PDO::FETCH_ASSOC)) 
{ 
    print_r($rows); 
} 

按照注释中,CREATE TABLE成功,但我不想我错过了什么?

我相信共享的PostgreSQL环境将是8.3,但稍后可能会在未来发布(我注意到这一点,因为我看到有多种授权选项在9​​.x之前不可用)我在本地运行9.3来测试事情,但现在想保持它与8.3兼容(直到更新版本到来线上)。

回答

1

默认情况下,任何人都可以在模式“公共”中执行所有操作。

postgres=# CREATE ROLE tom LOGIN; -- user without rights 
CREATE ROLE 
postgres=# SET role tom ; 
SET 
postgres=> CREATE TABLE bubu(a int); 
CREATE TABLE 

你必须删除创建公权的公共架构,其中在默认情况下。

postgres=# REVOKE CREATE ON SCHEMA public FROM public; 
REVOKE 
postgres=# SET role tom; 
SET 
postgres=> CREATE TABLE foo(a int); 
ERROR: permission denied for schema public 
LINE 1: CREATE TABLE foo(a int); 
        ^
+0

啊哈,谢谢。那么,我最好在自己的模式中创建一切,那么可以添加明确的权限,或者使用“公共”的权限(然后像您说的那样撤消),通常会使用? – halfer

+0

取决于你做什么。从我的角度来看,你所描述的方式都是+/-相同的。您可以将“public”模式公开化,或者您可以通过'search_path'创建自己的模式并指定缺省表格搜索。结果完全相同。一种是“甲骨文”的方式,第二种是“MySQL”的方式 - 但零差异。 –

+0

好的,谢谢 - 我会试一试并报告回来! – halfer