【发布时间】:2015-05-29 18:20:37
【问题描述】:
我正在考虑从 MySQL 切换到 PostgreSQL,因为 MySQL 在共享主机环境中全文功能的限制(不能更改最小字长)。我没有 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 兼容(直到更高版本上线)。
【问题讨论】:
标签: php postgresql pdo