如何在夹具加载期间防止alter table / trigger启用

时间:2011-06-16 21:16:27

标签: ruby-on-rails fixtures rails-postgresql

我正在编写一个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”...

1 个答案:

答案 0 :(得分:-1)

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

ALTER TABLE auth_message OWNER TO [your_username];

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

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

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

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

  3. 您可以使您的db用户成为超级用户,但这会绕过所有其他权限检查。

  4. 我认为您真正的解决方案是确保数据库更改仅来自一个应用程序。

    修改

    实际上我只想到了一个更好的方法。

    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用户共享该表的所有权。