在django orm上将角色设置为oracle数据库用户

时间:2014-07-18 13:13:37

标签: python django django-models oracle11g

我需要将遗留的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语句

1 个答案:

答案 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数据库,也没有测试过,但它应该指出正确的方向。