我可以在Rails中锁定一个表吗? (我应该吗?)

时间:2012-02-06 17:29:46

标签: ruby-on-rails-3 postgresql

我的Rails应用程序中有一个包含静态数据(用户角色)的小表。它不应该改变。我想知道是否可以锁定表格以防止任何人(即开发人员)在生产中意外更改它。

或者我应该没有将数据放入数据库中?它是否应该在某处进行硬编码以使编辑更加困难,至少可审计(git blame)?

3 个答案:

答案 0 :(得分:1)

执行此操作的正确方法是使用权限。将表的所有权更改为另一个用户,并仅授予生产数据库用户SELECT。

我想说这些事情的正确位置可能就是数据库。这样,如果他们需要更改,您可以在数据库中更改它们,并且您不必重新部署应用程序(假设它会注意到更改)。

你没有问这个问题,但是你的措辞让我想起了所以我还是会说:你永远不需要用PostgreSQL显式地LOCK表。如果您认为这是您需要做的事情,那么您应该确保您担心的事实在MVCC下实际发生并且交易不会为您做正确的事情。

答案 1 :(得分:1)

我可能会使用attr_accesible

如果您写的内容如下:

class Role < ActiveRecord::Base
  attr_accessible #none
end

您至少可以阻止来自rails端的任何分配,但它不会阻止通过数据库访问的开发人员进行任何直接修改。

另见此主题:How I can set 'attr_accessible' in order to NOT allow access to ANY of the fields FOR a model using Ruby on Rails?

答案 2 :(得分:0)

您可以使用触发器来阻止对表的更新(假设您无法添加新的db用户)。

或者,使用视图并确保所有读取请求都通过它。 (可能通过删除与表对应的ActiveRecord类。