Django多库/多Schema环境下Oracle ORA-00942错误求助
受限用户权限未完全授予:即使多数业务查询正常,部分表/视图可能未给default受限用户分配足够权限。Oracle中,若管理员通过migrations数据库创建了
schema.items表或视图,需显式给default用户授予该对象的SELECT权限(如果是视图,还要确保视图依赖的底层表也给了权限),否则会触发ORA-00942错误。db_table的大小写匹配问题:Oracle默认创建的表名是大写格式(如
SCHEMA.ITEMS),如果你在models.py中设置db_table = '"schema"."items"',双引号会强制Oracle区分大小写,导致实际表名和配置的大小写不匹配,从而找不到表。正确的写法应该是匹配实际表名的大小写,比如表是大写就写"SCHEMA"."ITEMS",或者去掉双引号让Oracle自动匹配大写(db_table = 'schema.items')。数据库路由配置缺失:如果部分模型或视图操作没有正确绑定到对应的数据库,可能出现跨权限访问的情况。比如某些查询错误地使用了default数据库,但default用户无权限访问目标表;或者迁移时创建的表,没有通过路由规则让对应模型使用migrations数据库(虽然迁移用了migrations库,但运行时部分模型可能没正确关联)。
视图的Schema引用不完整:若报错的是视图,可能视图定义时未指定完整Schema。比如视图定义为
SELECT * FROM items而非SELECT * FROM schema.items,当default受限用户访问该视图时,会默认查找自身Schema下的items表,而非目标Schema的表,进而报错。Django元数据缓存问题:Django可能缓存了旧的模型元数据,导致生成的SQL仍然使用不带Schema的表名。可以尝试执行
python manage.py clearcache清理缓存,或重启服务重新加载模型定义。
内容的提问来源于stack exchange,提问作者George Nassar

