每当我尝试从界面复制或删除数据库时,即使所有用户都已注销,我也总会收到此错误:
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', type='json', auth="none")
def drop(self, fields):
password, db = operator.itemgetter(
'drop_pwd', 'drop_db')(
dict(map(operator.itemgetter('name', 'value'), 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')}
中找到了这个说明
[...]此操作要求没有连接 数据库被复制,但Odoo目前没有破解 现有/未完成的连接,所以重新启动服务器是 确保一切都处于正确状态的最简单方法。
可以安全地覆盖这些控制器吗?有什么更好的方法呢?我想使用界面执行此操作,因为如果我手动执行此操作或者每次需要停止服务器都非常烦人。
答案 0 :(得分:1)
当客户端连接到postgres数据库时,您无法删除它。
是一种非常强大的解决方法确保没有人可以连接到此数据库
update pg_database set datallowconn = 'false' where datname = 'mydb';
强制断开连接到此数据库的所有客户端。
对于postgres&lt; 9.2:
SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname = 'mydb';
对于postgres版本&gt; = 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服务器查询的简单包装器。
答案 1 :(得分:-1)
转到postgresql数据库并右键单击您的数据库,您将获得删除/删除数据库的选项。那时如果你收到此错误,请尝试从服务列表中停止odoo服务器并重试。