1

我正在编写一个从另一个(遗留,因为它没有任何单元测试......)系统表读取数据的 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"...

4

1 回答 1

-1

这里的简单解决方案是(登录到 pgAdmin 或 psql:

ALTER TABLE auth_message OWNER TO [your_username];

然后您的命令将起作用。您还可以将更改包装在存储过程中,该存储过程可以设置为 SECURITY DEFINER 以允许其他用户进行更改。

这可能不是您想听到的答案,但基本上您只有三个选项,这是迄今为止最好的。为了更改表,您必须是所有者或超级用户,所以....

  1. 您可以执行上述操作(推荐)

  2. 您可以确保两个应用程序使用相同的用户名进行架构更改(我认为您没有这样做是有充分理由的)。

  3. 您可以使您的 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];

这将让两个不同的数据库用户共享表的所有权。

于 2013-03-21T09:55:28.837 回答