java - Spring Boot Model Class 仅在使用 Synonym 时访问 Oracle 表
问题描述
我有一个 Spring Boot 应用程序,需要创建一个访问数据库表的模型类。
由于数据库中的权限配置,SELECT 只能使用表名前面的用户名或使用 Oracle 同义词。
在 SQL 开发人员中:
SELECT * FROM MYTABLE; // This doesn't work - ORA-00942: table or view does not exist
SELECT * FROM MYUSER.MYTABLE; // This works
SELECT * FROM MYTABLE_SYNONYM; // This works
在 Oracle 中,MYTABLE_SYNONYM 是 MYTABLE 的公共同义词。
所以上面的最后两个 SELECTS 正在访问同一个 MYTABLE 表。
在应用程序中:
@Entity
//@Table(name = "MYTABLE") // This doesn't work - ORA-00942: table or view does not exist
//@Table(name = "MYUSER.MYTABLE") // This DOESN'T work - ORA-00942: table or view does not exist
@Table(name = "MYTABLE_SYNONYM") // This works
public class MyClass implements Serializable {
....
}
我的问题是,如果 SELECT * FROM MYUSER.MYTABLE 在 SQL Developer 中工作正常,为什么 @Table(name = "MYUSER.MYTABLE") 会生成“ORA-00942”错误?
在应用程序中,唯一的工作方式是使用公共同义词。
但我不喜欢使用同义词,因为它可能会导致应用程序维护混乱和困难,因为名称与实际表名不同。
谢谢。
解决方案
注释@Table(name = "MYTABLE")
不起作用,因为您用来访问数据库的用户可以访问另一个架构作为默认架构。
注释@Table(name = "MYUSER.MYTABLE")
不起作用,因为这不是访问不同模式中的表的正确语法。您需要使用 @Table(name="MYTABLE", schema="MYUSER")
明确表示使用模式 MYUSER 的注释并在该模式中搜索名为 MYTABLE 的表。此语法在注释Table的 javadoc 中进行了解释:
(可选)表的架构。默认为用户的默认架构。
最后一个注释@Table(name = "MYTABLE_SYNONYM")
是因为有人定义了同义词 MYTABLE_SYNONYM 来访问模式 MYUSER 上的表 MYTABLE。从访问数据库的用户的角度来看,这是透明的。
推荐阅读
- typescript - 如何在打字稿中将字符串转换为日期格式?
- python - 如何从烧瓶中的中间件(app.before_request())返回烧瓶响应?
- c++ - 如何在 SFML 中屏蔽另一层的指定层?
- node.js - 如何为sequelize中的所有查询设置偏执:false?
- python - Chromedriver:在 PyInstalled exe 中支持多个版本
- firebase - Firestore 中大型组的安全规则
- android - Android 分裂,每个 abi 的不同资源
- php - 什么是 Linux 服务器中的 B4TM4N SH3LL PHP WEBSHELL
- mule-component - mule 4中的错误“您无法比较类型的值:Null”
- bash - 在单独的行中定义时,Docker build-arg 不会自动获取 env 变量