如何防止表被丢弃?

时间:2013-06-27 10:22:43

标签: postgresql

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

编辑:哇,我们在这里有一些误解。假设有一个庞大的共享QA数据库。有时人们会误操作像hibernate生成的模式这样的破坏性的东西,我正在寻找防止这种错误的方法。

5 个答案:

答案 0 :(得分:3)

  任何人(包括超级用户)都放弃了一些特定的桌子?

相信你的同龄人。

答案 1 :(得分:2)

您可以通过编写附加到ProcessUtility_hook的一些C代码来实现。如果你从未做过那样的事情,那将不会是微不足道的,但它是可能的。

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

答案 2 :(得分:2)

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

没有必要让用户作为超级用户运行永远。当然不是模式迁移等自动化工具。

您的应用程序应以具有最低要求用户权限的用户身份进行连接。他们不应该拥有他们所操作的表,因此他们不能对它们进行架构更改或删除它们。

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

如果你真的需要做一些超出标准权限模型的事情,你需要写一个ProcessUtility_hook。有关详细信息,请参阅this related answer。即使这样,超级用户也可以通过加载一个跳过你的钩子的扩展来绕过它,你只需要稍稍放慢速度。

不要在生产中以超级用户身份运行应用程序。如初。

有关使用权限模型的更多指导,请参阅the PostgreSQL documentation on permissions

答案 3 :(得分:1)

我认为你不能那样做。您可能拥有超级超级用户,他们将首先管理所有内容的丢弃。或者不断备份,因此层次结构中较高的成员始终可以检索表。

答案 4 :(得分:0)

我不知道这个问题的真正初衷是什么......但很多人似乎都有假设的答案,比如信任你的同行或适当地使用最少权限模型。就个人而言,这完全没有抓住要点,而是用每个人都可能已经知道的东西来回答,这并不是特别有用。

那么让我尝试一个我自己的问题+答案:您如何安装安全锁以防止自己或他人意外地做您不应该做的事情?如果您认为这“不应该发生”,那么我认为您的想象力太狭隘了。或者也许你比我(可能还有很多其他人)更完美。

对于我们其他人,这里有一个适合我的解决方案。它只是一个小锁,可以放在任何你想要的地方——使用事件触发器。显然,这将由某种超级用户实现。但重点是它与权限无关,因为它基于错误而不是基于权限。

显然,如果生产行为依赖于它,则不应实施此类事情。只有在有意义的情况下才有意义。不要用它来代替应该使用权限解决的问题,也不要用它来破坏你的团队。使用常识 - 个人结果可能会有所不同。


CREATE SCHEMA testst;

CREATE OR REPLACE FUNCTION manual_override_required() RETURNS event_trigger AS
$$
DECLARE
    obj record;
BEGIN
FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects()
LOOP
    RAISE INFO 'object_oid: %, object_type: %', obj.objid, obj.object_type;
    RAISE info '%', obj.object_name;
    IF obj.object_type = 'schema' and obj.object_name = 'testst' THEN
        RAISE EXCEPTION 'You have attempted to DROP something which has been hyper-locked and requires manual override to proceed.';
    END IF;
END LOOP;
END
$$
LANGUAGE plpgsql
;


DROP EVENT TRIGGER IF EXISTS lock_schema;
CREATE EVENT TRIGGER lock_schema
   ON sql_drop
EXECUTE FUNCTION manual_override_required();

DROP SCHEMA testst;

-- produces error: "ERROR: You have attempted to DROP something which has been admin-locked and requires manual override to proceed."


-- To override the admin-lock (you have the permission to do this, it just requires two turns of a key and positive confirmation):

ALTER EVENT TRIGGER lock_schema DISABLE;


DROP SCHEMA testst;
-- now it works!


我在自动化工作流程中如何使用它的一个例子。我每天必须在 dev 和 prod 环境之间切换十几次,尽管我已经贴了巨大的旗帜和横幅来提醒自己,但我可以(即已经)很容易忘记哪个是哪个。删除某些模式在 Prod 中应该是罕见且特殊的事件(因此是主动确认方法的好处),而在开发中我一直在重建它们。如果我在 Dev 中保持与 Prod 中相同的权限结构(我这样做),那么我将无法解决这个问题。