我有一个用例,我需要阻止访问架构暂时中的所有对象,同时执行一些大的更改。我计划以架构所有者的身份执行更改。完成后,我想启用访问权限。我目前正在探索两种选择,并希望了解您对哪种方法效果更好的想法:
有更好的方法吗?我希望流程尽可能顺利,并确保在更改过程中没有人能够访问目标模式
答案 0 :(得分:0)
触发。除了具有dba角色的用户之外,此触发器适用于所有人。
CREATE OR REPLACE TRIGGER logon_audit_trigger
AFTER LOGON
ON DATABASE
DECLARE
BEGIN
raise_application_error (-20001, 'You cannot login.');
END;
如果您想知道尝试登录的人和地点。您可以从SYS_CONTEXT获取这些信息。
SELECT SYS_CONTEXT ('USERENV', 'SESSION_USER')
FROM DUAL;
答案 1 :(得分:0)
您可以考虑停顿数据库。锁定用户或撤消权限的缺点是用户将收到错误(您无法访问或无法登录等)。停顿数据库意味着活动会话将完成其工作,但随后将挂起,直到数据库取消静默。然后,您执行修改,并保证不会阻止您对要更新的对象的独占访问。更新后(或者甚至在您对相关对象进行锁定后的更新期间),取消静默数据库。
当然,这种方法的缺点是它跨越整个数据库而不是仅仅一个模式。这样做的好处是您的用户不会遇到任何错误消息,如果您将DML转换为DDL(如下所述)以大大加快停机时间窗口,那么大多数用户都不应该体验超过几秒钟的不活动。
关于在Oracle FAQ停顿数据库的问题很好。您必须让您的DBA参与静默数据库并将更改生效,因为只有系统或sys才能执行此操作。
对于DML,您可以考虑在停机时间窗口启动之前创建一个包含所需数据的新表。然后,当停机窗口启动时,重命名旧表,将新表重命名为旧表,重新创建权限,以获得更快的停机时间窗口(因为这有效地将DML更新转换为DDL)。 Tom Kyte讨论了这种方法here。
此外,不言而喻,应该在上述程序的测试环境中进行适当的测试,这将解决这个过程中的任何问题,并让你很好地了解系统需要停顿多长时间对