由于在共享主机环境中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兼容(直到更新版本到来线上)。
啊哈,谢谢。那么,我最好在自己的模式中创建一切,那么可以添加明确的权限,或者使用“公共”的权限(然后像您说的那样撤消),通常会使用? – halfer
取决于你做什么。从我的角度来看,你所描述的方式都是+/-相同的。您可以将“public”模式公开化,或者您可以通过'search_path'创建自己的模式并指定缺省表格搜索。结果完全相同。一种是“甲骨文”的方式,第二种是“MySQL”的方式 - 但零差异。 –
好的,谢谢 - 我会试一试并报告回来! – halfer