我需要将遗留的oracle数据库集成到django应用程序中。基本上我需要将一些表映射到django模型中。
连接正常,如下所示:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'orad03',
'USER': 'u_hrp',
'PASSWORD': 'myp4ssw0rd',
'HOST': 'myhost.com.br',
'PORT': '1521'
}
}
我的问题是,应用程序表在所有者ADM_HRP下,应用程序使用用户U_HRP(根本没有权限)。 INSERT,DELETE,SELECT等的权限位于角色R_HRP上。
因此,在传统的ASP / VbScript应用程序中,它在建立连接后立即设置角色:
Sub Connect()
Set objConexao = Server.CreateObject("ADODB.Connection")
objConexao.Mode = 3
objConexao.CommandTimeout = 90
Dim strDSN
strDSN="DSN=orad03;Uid=u_hrp;Pwd=myp4ssw0rd;"
objConexao.Open strDSN
objConexao.execute "SET ROLE R_HRP IDENTIFIED BY " & chr(34) & "myp4ssw0rd" & chr(34)
End Sub
我需要在我的django应用程序上做同样的事情,设法在打开连接后立即运行SET ROLE语句
答案 0 :(得分:1)
我不确定默认情况下是否有任何选项。但我认为你可以用Django信号(钩子)实现你的目标。
https://docs.djangoproject.com/en/dev/ref/signals/#connection-created
成功建立与数据库的新连接后,将调用connection_created 信号。它为您提供了一个连接对象。所以你可以这样做:
from django.db.backends.signals import connection_created
def set_role(**kwargs):
connection = kwargs.get("connection", None)
if connection:
cursor = connection.cursor()
cursor.execute("SET ROLE R_HRP IDENTIFIED BY %s", "myp4ssw0rd")
connection_created.connect(set_role)
我没有oracle数据库,也没有测试过,但它应该指出正确的方向。