📅  最后修改于: 2023-12-03 15:03:24.389000             🧑  作者: Mango
Oracle数据库中,对象之间存在依赖关系,即一个对象依赖于其他对象。了解对象依赖关系可以提高数据库开发和维护的效率。本文将介绍如何查询Oracle数据库中的对象依赖关系。
如果我们想知道一个表、视图、存储过程或其他对象被哪些对象引用,可以使用下面的SQL语句:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE referenced_owner = 'OWNER_NAME'
AND referenced_name = 'OBJECT_NAME'
ORDER BY owner, name;
owner
: 被引用的对象所在的模式(数据库用户)name
: 被引用的对象的名称type
: 被引用对象的类型,如TABLE
、VIEW
、PACKAGE
等referenced_owner
: 表示引用被查询的对象的模式(数据库用户)referenced_name
: 引用了被查询对象的对象的名称referenced_type
: 引用了被查询对象的对象的类型例如,我们要查询表EMP
被哪些对象引用:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE referenced_owner = 'SCOTT'
AND referenced_name = 'EMP'
ORDER BY owner, name;
输出结果如下:
| OWNER | NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | | --------- | --------------- | ------------- | ---------------- | --------------- | --------------- | | SCOTT | DEPT | TABLE | SCOTT | EMP | TABLE | | SCOTT | SALGRADE | TABLE | SCOTT | EMP | TABLE | | SYS | AW$FLSALESPROPS | TABLE | SCOTT | EMP | TABLE | | SYS | AW$PLPT_SALES_B | PACKAGE BODY | SCOTT | EMP | TABLE | | SYS | AW$PLPT_SALES_P | PACKAGE | SCOTT | EMP | TABLE | | SYS | AW$PROPS | TABLE | SCOTT | EMP | TABLE | | SYS | OLAPSUMMARY$ | MATERIALIZED VIEW | SCOTT | EMP | TABLE |
结果表明,在模式SCOTT
中,表EMP
被其他对象引用了。这些对象包括:
DEPT
和SALGRADE
AW$FLSALESPROPS
、AW$PLPT_SALES_B
、AW$PLPT_SALES_P
、AW$PROPS
、OLAPSUMMARY$
等其他系统表或对象。如果我们想知道一个表、视图、存储过程或其他对象依赖了哪些对象,可以使用下面的SQL语句:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE owner = 'OWNER_NAME'
AND name = 'OBJECT_NAME'
ORDER BY referenced_owner, referenced_name;
和上面的语句相比,唯一的区别在于条件的不同。owner
和name
表示要查询的对象的模式和名称。
例如,我们要查询表EMP
依赖了哪些对象:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE owner = 'SCOTT'
AND name = 'EMP'
ORDER BY referenced_owner, referenced_name;
输出结果如下:
| OWNER | NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | | --------- | ------------- | ------------- | ---------------- | --------------- | --------------- | | SCOTT | EMP | TABLE | PUBLIC | DEPT | TABLE | | SCOTT | EMP | TABLE | PUBLIC | SALGRADE | TABLE | | SCOTT | EMP | TABLE | SYS | AW$FLSALES | TABLE | | SCOTT | EMP | TABLE | SYS | AW$PLPT_SALES_B | PACKAGE | | SCOTT | EMP | TABLE | SYS | AW$PROPS | TABLE | | SCOTT | EMP | TABLE | SYS | OLAPSUMMARY$ | MATERIALIZED VIEW | | SCOTT | EMP_COPY | TABLE | SCOTT | EMP | TABLE | | SCOTT | EMP_MANAGERS | VIEW | SCOTT | EMP | TABLE | | SCOTT | EMP_PERSONNEL | VIEW | SCOTT | EMP | TABLE |
结果表明,表EMP
依赖了其他对象。这些对象包括:
DEPT
和SALGRADE
AW$FLSALES
、AW$PLPT_SALES_B
、AW$PROPS
、OLAPSUMMARY$
等EMP_COPY
EMP_MANAGERS
、EMP_PERSONNEL
等如果我们想知道一个对象依赖的所有对象,可以使用下面的SQL语句:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE owner = 'OWNER_NAME'
AND name = 'OBJECT_NAME'
AND referenced_type <> 'SYNONYM'
CONNECT BY PRIOR referenced_owner = owner
AND PRIOR referenced_name = name
AND PRIOR referenced_type = type;
该语句使用了CONNECT BY
语法实现树形结构查询。PRIOR
是一个伪列,用于引用CONNECT BY
子句中上一行查询结果中的列。在当前查询结果中的每一行,PRIOR referenced_owner
、PRIOR referenced_name
和PRIOR referenced_type
引用的是上一行的查询结果中的列。
例如,我们要查询表EMP
所依赖的所有对象:
SELECT owner, name, type, referenced_owner, referenced_name, referenced_type
FROM dba_dependencies
WHERE owner = 'SCOTT'
AND name = 'EMP'
AND referenced_type <> 'SYNONYM'
CONNECT BY PRIOR referenced_owner = owner
AND PRIOR referenced_name = name
AND PRIOR referenced_type = type;
输出结果如下:
| OWNER | NAME | TYPE | REFERENCED_OWNER | REFERENCED_NAME | REFERENCED_TYPE | | ----------- | ------------- | ------------- | ---------------- | --------------- | --------------- | | SCOTT | EMP | TABLE | SYS | OLAPSUMMARY$ | MATERIALIZED VIEW | | SCOTT | EMP | TABLE | SYS | AW$PLPT_SALES_B | PACKAGE | | SCOTT | EMP | TABLE | SYS | AW$PROPS | TABLE | | SCOTT | EMP | TABLE | SYS | AW$FLSALES | TABLE | | SCOTT | EMP | TABLE | | EMP_COPY | TABLE | | SCOTT | EMP | TABLE | PUBLIC | SALGRADE | TABLE | | SCOTT | EMP | TABLE | PUBLIC | DEPT | TABLE |
结果表明,查询到表EMP
依赖了其他对象,而这些对象还依赖了其他对象,形成了一个树形结构。
本文介绍了如何查询Oracle数据库中的对象依赖关系,包括查询被引用和依赖的对象。我们可以通过查询对象依赖关系,更好地理解数据库中的对象之间的关系,从而更有效地进行数据库开发和维护。