我最近不得不改变我的Django后端,以适应“受限数据库用户”。
不是使用负责执行/迁移迁移的数据库管理员用户查询数据库,而是创建了一个只对必要的表执行SELECT、UPDATE、UPDATE和UPDATE的用户。
我在settings.py中设置数据库如下:
DATABASES = {
'default': {'ENGINE': 'django.db.backends.oracle',
'NAME': 'dbname',
'USER': 'restricted',
'PASSWORD': '*********',
'HOST': '*******************',
'PORT': '****', },
'migrations': {
'ENGINE': 'django.db.backends.oracle',
'NAME': 'dbname',
'USER': 'admin',
'PASSWORD': '*********',
'HOST': '*********************',
'PORT': '****',
},
}
通过这样设置数据库,从视图执行的任何查询都将通过“默认”受限用户,admin用户仅用于迁移。为了迁移,你应该运行-python manage.py makemigrations
(此命令不会更改,因为它不关心数据库用户)
然后
python manage.py migrate --database=migrations
在这样做之后,我的观点都不起作用,我发现了原因。
我必须做的下一步是更改models.py中的所有db_table值,以匹配新用户的模式。
所以任何db_table值都是从这个
db_table = 'items'
本
db_table = '\"schema\".\"items\"'
现在这看起来像是解决方案,大部分代码都工作了,但后来我开始遇到一些非常具体的ORA-00942: table or view does not exist
错误,似乎是随机的视图和模型。如何更改这些db_table值以匹配模式仅适用于 * 某些 * 视图/模型?
经过许多愤怒,沮丧的在线搜索小时后,我找到了这个问题的答案,并认为我会在这里分享给任何可能在未来遇到类似问题的人。
1条答案
按热度按时间mbjcgjjk1#
问题不在于模式定义,也不在于我尝试的其他1000件事,而是我的一些表具有自动生成/递增列作为主键的事实,我没有意识到我必须向受限用户授予对负责填充这些列的序列的访问权。
希望我能用这个为别人保存一些时间:)