📜  oracle 对象依赖关系 - SQL (1)

📅  最后修改于: 2023-12-03 15:03:24.389000             🧑  作者: Mango

Oracle对象依赖关系 - SQL

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: 被引用对象的类型,如TABLEVIEWPACKAGE
  • 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被其他对象引用了。这些对象包括:

  • 另一个表DEPTSALGRADE
  • AW$FLSALESPROPSAW$PLPT_SALES_BAW$PLPT_SALES_PAW$PROPSOLAPSUMMARY$等其他系统表或对象。
查询表、视图、存储过程等对象依赖的情况

如果我们想知道一个表、视图、存储过程或其他对象依赖了哪些对象,可以使用下面的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;

和上面的语句相比,唯一的区别在于条件的不同。ownername表示要查询的对象的模式和名称。

例如,我们要查询表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依赖了其他对象。这些对象包括:

  • 公共对象DEPTSALGRADE
  • 系统对象AW$FLSALESAW$PLPT_SALES_BAW$PROPSOLAPSUMMARY$
  • 用户表EMP_COPY
  • 用户视图EMP_MANAGERSEMP_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_ownerPRIOR referenced_namePRIOR 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数据库中的对象依赖关系,包括查询被引用和依赖的对象。我们可以通过查询对象依赖关系,更好地理解数据库中的对象之间的关系,从而更有效地进行数据库开发和维护。