Nano Hash - криптовалюты, майнинг, программирование

Как найти все ограничения внешнего ключа в Oracle?

В StackOverflow я могу найти сообщение о том, как найти все ограничения внешнего ключа в SQL Server.

Я могу найти только сообщение о том, как найти все ограничения внешнего ключа для таблицы в Oralce (Список внешних ключей и таблицы, на которые они ссылаются).

Мой вопрос: как я могу перечислить все ограничения внешнего ключа для всех таблиц, а не для таблицы в Oracle. Я хочу ответить примерно так: этот, но для Oracle.

P.S. Я использую экспресс-выпуск Oralce 11g. Мой инструмент управления графическим интерфейсом пользователя Oracle - это разработчик Orace SQL.

30.07.2017

Ответы:


1

Я бы так и поступил;

Если вы хотите, чтобы он был объединен со всеми столбцами в одной строке

select distinct c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name, 
listagg(c2.column_name,',') WITHIN GROUP ( ORDER BY C2.POSITION) OVER ( PARTITION BY c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name ) column_list
from dba_constraints c1
JOIN dba_cons_columns c2
ON c1.R_CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.r_owner=c2.owner
where C1.constraint_type = 'R'

или так, если вам нужна одна строка на столбец

select  c1.owner, c1.table_name, c1.constraint_name, c2.owner, c2.table_name, c2.column_name
from dba_constraints c1
JOIN dba_cons_columns c2
ON c1.R_CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.r_owner=c2.owner
where C1.constraint_type = 'R'
order by c1.owner, c1.table_name, c1.constraint_name, c2.position

или если вы хотите ссылаться на сведения о столбцах И сведения о ссылках на столбцы

with constraint_colum_list as ( select owner, table_name, constraint_name, listagg(column_name,',') WITHIN GROUP ( order by position ) as column_list
                                FROM DBA_CONS_COLUMNS GROUP BY owner, table_name, constraint_name )
select distinct c1.owner, c1.table_name, c1.constraint_name, c2.column_list, c3.owner, c3.table_name, c3.constraint_name, c3.column_list
from DBA_constraints c1
JOIN constraint_colum_list c2 ON c1.CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.owner=c2.owner
JOIN constraint_colum_list c3 ON C1.R_CONSTRAINT_NAME=C3.CONSTRAINT_NAME AND C1.R_OWNER=C3.owner
where C1.constraint_type = 'R' 
-- AND c1.owner = 'YOUR_SCHEMA';
30.07.2017
  • Для вашего последнего решения 'AND c1.owner =' YOUR_SCHEMA ';' Если мое имя для входа в систему для разработчика oracle sql - TestDemo, мне нужно выполнить AND c1.owner = 'TestDemo'; Затем я могу выводить только те ограничения внешнего ключа, которые я указываю / создаю. Но SQL Server в этом не нуждается, это нужно только Oracle? 31.07.2017
  • Мой ответ основан на том, что вы запросили ВСЕ внешние ключи для ВСЕХ таблиц. Если вас интересует только ваш, замените DBA_CONSTRAINTS на USER_CONSTRAINTS и DBA_CONS_COLUMNS на USER_CONS_COLUMNS, и вы увидите только свой собственный 31.07.2017
  • Здорово. Оно работает. Могу ли я узнать, для каких других результатов обычно используется DBA_CONSTRAINTS? Я знаю только те ограничения внешнего ключа, указанные пользователем / нами, полезны, потому что я могу видеть отношения между таблицами и столбцами, поэтому я могу знать бизнес-домен проекта. 31.07.2017
  • все виды каталогов работают одинаково. у вас есть DBA_ версия, которая содержит данные для всей базы данных, ALL_, которая содержит объекты, к которым вызывающий пользователь имеет доступ, и USER_, которая содержит только владельца объекта пользователем. но их много DBS_OBJECTS DBA_TABLE DBA_TAB_PRIV и т. д. все они находятся в документации оракула здесь: docs.oracle.com/cd/E11882_01/nav/catalog_views.htm 31.07.2017

  • 2

    Этот ответ основан на решении LauDec.

    Поскольку мне нужны только все ограничения внешнего ключа, указанные мной / пользователем, я буду использовать следующий SQL:

    with constraint_colum_list as ( select owner, table_name, constraint_name, listagg(column_name,',') WITHIN GROUP ( order by position ) as column_list
                                    FROM USER_CONS_COLUMNS GROUP BY owner, table_name, constraint_name )
    select distinct c1.owner, c1.table_name, c1.constraint_name, c2.column_list, c3.owner, c3.table_name, c3.constraint_name, c3.column_list
    from USER_CONSTRAINTS c1
    JOIN constraint_colum_list c2 ON c1.CONSTRAINT_NAME=C2.CONSTRAINT_NAME and c1.owner=c2.owner
    JOIN constraint_colum_list c3 ON C1.R_CONSTRAINT_NAME=C3.CONSTRAINT_NAME AND C1.R_OWNER=C3.owner
    where C1.constraint_type = 'R'; 
    
    31.07.2017

    3

    Не используйте имя таблицы в условии where, и вы получите ограничения FK для всех таблиц.

    SELECT A.TABLE_NAME,
           A.COLUMN_NAME,
           A.CONSTRAINT_NAME, 
           C.OWNER
    FROM   ALL_CONS_COLUMNS A, 
           ALL_CONSTRAINTS C  
    WHERE  A.CONSTRAINT_NAME = C.CONSTRAINT_NAME 
    AND    C.CONSTRAINT_TYPE = 'R'
    AND    C.OWNER = 'MyDBLoginName';
    
    30.07.2017
  • Думаю, мне нужно добавить еще одно условие where 'AND C.OWNER = MyDBLoginName'. В противном случае, если я буду использовать только ваш код, он будет перечислять слишком много столбцов, в которых C.OWNER - это «SYS», «SYSTEM», «HR» и т. Д., Что мне не нужно. 30.07.2017
  • Можете ли вы также вывести ссылочную таблицу и ссылочный столбец? 30.07.2017
  • мое решение делает это :) 30.07.2017
  • @ hemalp108: Думаю, вам не хватает условия в предложении о соединении. Имя ограничения не является уникальной перекрестной схемой, если у вас есть 2 схемы с одинаковым именем constraint_name, вы собираетесь сопоставить несвязанные строки. вам следует добавить AND A.OWNER=C.OWNER. 30.07.2017
  • @LauDec Да, я хочу твое последнее решение. Могу я узнать, как вы пришли к этому решению? Любой предлагаемый справочный документ для меня, чтобы я мог написать решение, как вы? 31.07.2017
  • @CodeContributor Я весь день держу руки в представлении каталога oracle :) Но документацию для представлений, которые я использовал, можно найти docs.oracle.com/cd/B28359_01/server.111/b28320/ и docs.oracle.com/cd/B28359_01/server.111/b28320/ 31.07.2017

  • 4

    Ниже запрос дает имя таблицы, имя столбца как родительской, так и дочерней таблиц, а также имена ограничений для каждой из них.

    select a.table_name child_table, a.column_name child_column, b.table_name parent_table, b.column_name parent_column, a.position, a.constraint_name child_constraint, b.constraint_name parent_constraint
    from all_cons_columns a
    join all_constraints lc on a.owner = lc.owner and a.constraint_name = lc.constraint_name
    join all_constraints rc on lc.r_owner = rc.owner and lc.r_constraint_name = rc.constraint_name 
    join all_cons_columns b on rc.owner = b.owner and rc.constraint_name = b.constraint_name and a.position = b.position
    where a.owner = '<Schema Name>'
    and lc.constraint_type = 'R'
    order by a.constraint_name, a.table_name, a.position
    

    Вот краткое объяснение таблиц, используемых в SQL выше:

    • all_constraints - содержит имя ограничения, имя таблицы, имя ограничения родительской таблицы FK. Поле Constraint_type в этой таблице определяет типы ограничений. Ограничения внешнего ключа определяются буквой R.
    • all_cons_columns - содержит список имен столбцов для каждого ограничения, столбец позиции в этой таблице определяет порядок столбца
      в ограничении.
    06.07.2020
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..