我有一个java
应用程序,它使用Carbanado
与Oracle数据库进行交互。
我想知道所有表的依赖关系图(其中依赖关系是外键约束),以便通过应用程序进行进一步处理。
举个例子:
Table A defines dependency over Table B and Table C (means Table A has foreign key constraint on Table B and Table C).
Table B defines dependency over Table C and Table D.
我想要这样的东西(它将是真实场景中的二维图形)。
Table A=>Table B=>Table C=>Table D
这样可以在删除表A,B和C中的相应行之前先删除表D中的行。
所有实体类都实现了一个公共接口(Storable
),并使用@Join
注释了依赖项。加载所有类并使用广泛的反射似乎是一种方法。
>>Load all classes.
>>Create 2D matrix (adjacency matrix) and populate it by going through each class and extracting/processing @Join annotation.
>>Put 0/1 at suitable position.
>>Final matrix will be showing the dependencies.
>>Perform any topological operation.
还有更好的方法吗?
PS:
其他信息:
谢谢!
答案 0 :(得分:1)
可能不是完全您要查找的内容,但您可以查询ALL_CONSTRAINTS
(或USER_CONSTRAINTS
)和ALL_CONS_COLUMNS
来构建相关性的邻接列表曲线图。
例如,之类的会将从和返回到表以获取外键约束:
SELECT uc.OWNER, uc.CONSTRAINT_NAME,
uc.TABLE_NAME from_table,
acc.TABLE_NAME to_table
FROM USER_CONSTRAINTS uc LEFT JOIN ALL_CONS_COLUMNS acc
ON uc.R_CONSTRAINT_NAME = acc.CONSTRAINT_NAME
AND uc.OWNER = acc.OWNER
WHERE uc.CONSTRAINT_TYPE = 'R';
鉴于架构:
CREATE TABLE A(N NUMBER(2), PRIMARY KEY (N));
CREATE TABLE B(N NUMBER(2) REFERENCES A(N));
CREATE TABLE C(N NUMBER(2) REFERENCES A(N), M NUMBER(2) REFERENCES A(N));
它会产生:
OWNER CONSTRAINT_NAME FROM_TABLE TO_TABLE
SYLVAIN SYS_C008530 C A
SYLVAIN SYS_C008529 C A
SYLVAIN SYS_C008528 B A