2013-06-27 76 views
4

在PostgreSQL中,如何防止任何人(包括超级用户)放弃某个特定的表?如何防止表被丢弃?

编辑:哇,我们在这里有一些误解。假设有一个大的共享QA数据库。有时候人们会错误地运行像Hibernate生成的架构等破坏性的东西,而我正在寻找方法来防止这种错误。

+0

不要成为像NSA那样的邪恶公司。 –

+1

@GilbertLeBlanc国家安全局不是一家公司,这不是邪恶。 – mitchfish36

+1

阻止“运行hibernate生成的模式”的唯一方法是撤销“常规”用户的任何DDL特权,并且有专门的用户来创建和管理数据库中的对象。只有“DBA”(或负责管理对象的人)才能连接为“对象所有者”并运行DDL语句。很多我们的客户以这种方式限制了对数据库的访问(“应用程序用户”只能运行DML,仅此而已)。这在大公司中并不罕见。 –

回答

3

任何人(包括超级用户)掉落一些特定的表?

信任你的同行。

+0

或添加超级超级用户。但是,请等待,如何防止此用户丢弃表格然后......? – Uooo

+0

@ w4rumy:拥有超级超级超级用户。它一直都是超级的。 :-) –

+0

@GilbertLeBlanc Aaaaah,我没有想到! :) – Uooo

1

我不认为你可以这样做。你也许可以拥有超级用户,他们将首先处理所有事情。或者经常备份,所以层次结构的更高层成员总是可以检索表格。

2

您可以通过编写重视ProcessUtility_hook一些C代码做到这一点。如果你从来没有做过这样的事情,它不会是微不足道的,但它是可能的。

另一个选择可能是调查sepgsql,但我没有任何经验。

+0

开源数据库的好处的一个主要例子。 – Kuberchaun

+0

编写ProcessUtility_hook实际上并不难,但PostgreSQL 9.2和9.3定义之间存在差异,这意味着您需要单独的扩展。这里有一个基本的例子:https://github.com/ringerc/scrapcode/tree/master/postgresql/example_processutility_hook这里有一个ProcessUtility钩子,它确实有用:https://github.com/ringerc/postgres/blob/bdr -reject不安全的命令/的contrib/BDR/bdr_commandfilter.c –

2

超级用户就是这样。如果你不希望他们能够放下东西,不要让他们成为超级用户。

有没有必要让用户几乎作为超级用户运行有史以来。当然不是像模式迁移这样的自动化工具。

您的应用程序应该以具有所需最小用户权限的用户身份进行连接。他们不应该使用拥有他们操作的表,所以他们不能对它们进行模式更改或删除它们。

当你要进行架构更改,运行使用确实有感兴趣的表的所有权,但不是超级用户的应用程序。表所有者可以删除和修改表,但只能删除它拥有的表。

如果你真的,真的需要做一些超出标准权限模型,你需要写一个ProcessUtility_hook。有关这方面的一些细节,请参见this related answer。即使这样,一个超级用户也许可以通过加载一个可以跳过你的钩子的扩展来解决它,你只需稍微放慢它们。

不要在生产环境中以超级用户身份运行应用程序。永远。

获得更多指导见the PostgreSQL documentation on permissions使用的权限模型。