Oracle所有外键引用

Oracle所有外键引用,oracle,Oracle,我继承了一个模式,因此对其中的内容没有完全的了解/信心 我有一个带有projectd的项目表。有一大堆其他表通过项目id引用此表。我要做的是运行查询以建立: 哪些表对上的项目表具有外键引用 项目id 在中,哪些表具有名为project id的列 未设置外壳外键。 如果是SQL Server,我知道如何查询元数据,但如何在Oracle中查询元数据?1:从用户约束中选择*,其中约束\u NAME='R'和约束\u NAME='xxx' 其中xxx是项目表上主键约束的名称 2:从“用户”选项卡中的列中

我继承了一个模式,因此对其中的内容没有完全的了解/信心

我有一个带有projectd的项目表。有一大堆其他表通过项目id引用此表。我要做的是运行查询以建立:

哪些表对上的项目表具有外键引用 项目id 在中,哪些表具有名为project id的列 未设置外壳外键。 如果是SQL Server,我知道如何查询元数据,但如何在Oracle中查询元数据?

1:从用户约束中选择*,其中约束\u NAME='R'和约束\u NAME='xxx'

其中xxx是项目表上主键约束的名称

2:从“用户”选项卡中的列中选择*,其中列\u NAME='PROJECT\u ID'

1

二,

您可能需要添加一个包含所有者列的额外谓词

问候,, Rob.

此处的r\u约束\u名称答案似乎对我不起作用,我不知道为什么,因为我本人是Oracle的新手,但这很有效:

SELECT * FROM ALL_CONSTRAINTS WHERE CONSTRAINT_NAME = '<constraint>';

嗯。下面是一个请求,它为您提供了引用的表和列:

SELECT
 c_list.CONSTRAINT_NAME as NAME,
 substr(c_src.COLUMN_NAME, 1, 20) as SRC_COLUMN,
 c_dest.TABLE_NAME as DEST_TABLE,
 substr(c_dest.COLUMN_NAME, 1, 20) as DEST_COLUMN
FROM ALL_CONSTRAINTS c_list, ALL_CONS_COLUMNS c_src, ALL_CONS_COLUMNS c_dest
WHERE c_list.CONSTRAINT_NAME   = c_src.CONSTRAINT_NAME
 AND  c_list.OWNER             = c_src.OWNER
 AND  c_list.R_CONSTRAINT_NAME = c_dest.CONSTRAINT_NAME
 AND  c_list.OWNER             = c_dest.OWNER
 AND  c_list.CONSTRAINT_TYPE = 'R'
 AND  c_src.OWNER      = '<your-schema-here>'
 AND  c_src.TABLE_NAME = '<your-table-here>'
GROUP BY c_list.CONSTRAINT_NAME, c_src.TABLE_NAME,
    c_src.COLUMN_NAME, c_dest.TABLE_NAME, c_dest.COLUMN_NAME;

如果结果在没有任何限制的情况下可用,则可以忽略substr函数。这不是我的情况。

我的问题略有不同。我有一个表,我想通过编程知道它引用了哪些其他表/列

我从Stan上面的回答开始,但这并没有给我真正需要的,所以我想出了这个,我把它贴在这里,以防其他人有我的问题:

WITH src as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND ac.constraint_type = 'R'
   AND ac.table_name = '<src_table>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position),
dst as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position)
SELECT src.table_name as src_table,
       dst.table_name as dst_table,
       src.constraint_name as src_constraint,
       src.column_name as src_column,
       dst.column_name as dst_column,
       src.position as position
  FROM src,dst
 WHERE src.r_constraint_name = dst.constraint_name
   AND src.position = dst.position
使用此查询

   select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME
   from all_constraints b, all_cons_columns a
   where r_constraint_name = 'Constraint_Name' and  a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;

外键约束可能会跨模式,所以我不会选择用户约束。用户选项卡列的Idem。罗伯:这要看情况而定。在我的环境中,用户。。。够了,所有的tab列都会给出误导性的结果。用户界面。。。也许足够了。但是请看线程的标题:所有外键引用。。。
NAME                  |SRC_COLUMN      |DEST_TABLE            | DEST_COLUMN
----------------------|----------------|----------------------|-----------
CFK_RUB_FOR           |FOR_URN         |T03_FORMAT            |FOR_URN
CFK_RUB_RUB           |RUB_RUB_URN     |T01_RUBRIQUE          |RUB_URN
CFK_RUB_SUP           |SUP_URN         |T01_SUPPORT           |SUP_URN
CFK_RUB_PRD           |PRD_URN         |T05_PRODUIT           |PRD_URN
WITH src as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position, ac.r_constraint_name
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND ac.constraint_type = 'R'
   AND ac.table_name = '<src_table>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position),
dst as
(SELECT ac.table_name, ac.constraint_name, accs.column_name, accs.position
  FROM ALL_CONSTRAINTS ac, all_cons_columns accs
 WHERE ac.owner = '<owner>'
   AND accs.owner = ac.owner
   AND accs.table_name = ac.table_name
   AND accs.constraint_name = ac.constraint_name
ORDER BY ac.table_name, ac.constraint_name, accs.position)
SELECT src.table_name as src_table,
       dst.table_name as dst_table,
       src.constraint_name as src_constraint,
       src.column_name as src_column,
       dst.column_name as dst_column,
       src.position as position
  FROM src,dst
 WHERE src.r_constraint_name = dst.constraint_name
   AND src.position = dst.position
   select b.TABLE_NAME,b.CONSTRAINT_NAME ,a.COLUMN_NAME
   from all_constraints b, all_cons_columns a
   where r_constraint_name = 'Constraint_Name' and  a.CONSTRAINT_NAME=b.CONSTRAINT_NAME;