我正在编写一个rails应用程序,它从另一个(遗留的,因为它没有任何单元测试...)系统表中读取数据。它对这些表没有任何权限(最终,它将包含并扩展...)
我正在共享同一个数据库(postgresql),这两个应用程序有不同的数据库用户。当我加载我的初始灯具时,我得到投诉,因为rails试图改变 所有表启用触发器。我能把它关掉吗?
PGError:错误:必须是关系auth_message的所有者 :ALTER TABLE“auth_message”ENABLE TRIGGER ALL; ALTER TABLE“django_session”ENABLE TRIGGER ALL; ALTER TABLE“django_site”ENABLE TRIGGER ALL; ALTER TABLE“django_admin_log”ENABLE TRIGGER ALL; ALTER TABLE“django_content_type”...
答案 0 :(得分:-1)
这里的简单解决方案是(登录到pgAdmin或psql:
ALTER TABLE auth_message OWNER TO [your_username];
然后你的命令就可以了。您还可以将更改包装在存储过程中,该存储过程可以设置为SECURITY DEFINER以允许其他用户进行更改。
这可能不是您想要听到的答案,但基本上您只有三个选项,这是迄今为止最好的选择。为了改变一个表,你必须是所有者或者是超级用户,所以....
您可以执行以上操作(推荐)
您可以确保两个应用程序使用相同的用户名进行架构更改(我假设您有充分的理由不这样做)。
您可以使您的db用户成为超级用户,但这会绕过所有其他权限检查。
我认为您真正的解决方案是确保数据库更改仅来自一个应用程序。
修改强>
实际上我只想到了一个更好的方法。
CREATE ROLE auth_message_owner WITH INHERIT NOLOGIN;
ALTER TABLE auth_message OWNER TO auth_message_owner;
GRANT auth_message_owner TO [app_user_1];
GRANT auth_message_owner TO [app_user_2];
这将允许两个不同的db用户共享该表的所有权。