加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

postgresql – 我无法从Odoo界面复制或删除数据库,因为有会话使

发布时间:2020-12-13 16:17:51 所属栏目:百科 来源:网络整理
导读:每次我尝试从界面复制或删除数据库时,我总是会收到此错误,即使所有用户都已注销: ERROR: source database "database_name" is being accessed by other usersDETAIL: There are 5 other sessions using the database. 然后,如果想要复制或删除数据库,我必须
每次我尝试从界面复制或删除数据库时,我总是会收到此错误,即使所有用户都已注销:
ERROR:  source database "database_name" is being accessed by other users
DETAIL:  There are 5 other sessions using the database.

然后,如果想要复制或删除数据库,我必须运行此查询以终止所有连接:

SELECT pg_terminate_backend(pg_stat_activity.pid) 
FROM pg_stat_activity 
WHERE pg_stat_activity.datname = 'database_name' AND pid <> pg_backend_pid();

我想要做的是覆盖以下控制器,以便在执行函数duplicate_database和drop之前始终运行查询:

@http.route('/web/database/duplicate',type='json',auth="none")
def duplicate(self,fields):
    params = dict(map(operator.itemgetter('name','value'),fields))
    duplicate_attrs = (
        params['super_admin_pwd'],params['db_original_name'],params['db_name'],)
    return request.session.proxy("db").duplicate_database(*duplicate_attrs)

@http.route('/web/database/drop',auth="none")
def drop(self,fields):
    password,db = operator.itemgetter(
        'drop_pwd','drop_db')(
            dict(map(operator.itemgetter('name',fields)))
    try:
        if request.session.proxy("db").drop(password,db):
            return True
        else:
            return False
    except openerp.exceptions.AccessDenied:
        return {'error': 'AccessDenied','title': 'Drop Database'}
    except Exception:
        return {'error': _('Could not drop database !'),'title': _('Drop Database')}

我在Documentation of Odoo中找到了这个注释:

[…] This operation requires that there be no connection to the
database being duplicated,but Odoo doesn’t currently break
existing/outstanding connections,so restarting the server is the
simplest way to ensure everything is in the right state.

可以安全地覆盖这些控制器吗?有什么更好的方法呢?我想使用界面执行此操作,因为如果我手动执行此操作或者每次需要我必须停止服务器都非常烦人.

在客户端连接到postgres数据库时,您无法删除它.相当强大的解决方法,是

确保没有人可以连接到此数据库

update pg_database set datallowconn = 'false' where datname = 'mydb';

强制断开连接到此数据库的所有客户端.

对于postgres< 9.2:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';

对于postgres版本> = 9.2将procpid更改为pid:

SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = 'mydb';

算了吧

DROP DATABASE mydb;

步骤1和2需要超级用户权限,步骤3需要数据库所有者权限.

你不能只使用dropdb实用程序 – 这是DROP DATABASE服务器查询的简单包装器.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读