Làm cách nào tôi có thể tìm thấy bảng nào tham chiếu một bảng đã cho trong Oracle SQL Developer?


199

Trong Oracle SQL Developer , nếu tôi đang xem thông tin trên một bảng, tôi có thể xem các ràng buộc, cho phép tôi xem các khóa ngoại (và do đó các bảng được tham chiếu bởi bảng này) và tôi có thể xem các phụ thuộc để xem những gì phụ thuộc để xem gói và tham khảo như vậy bảng. Nhưng tôi không chắc làm thế nào để tìm bảng nào tham chiếu bảng.

Ví dụ, giả sử tôi đang nhìn vào empbàn. Có một bảng khác emp_deptghi lại nhân viên nào làm việc trong các phòng ban, tham chiếu empbảng thông qua emp_id, khóa chính của empbảng. Có cách nào (thông qua một số phần tử UI trong chương trình, không phải thông qua SQL) để thấy rằng emp_deptbảng tham chiếu empbảng mà không cần tôi phải biết rằng emp_deptbảng tồn tại?

Câu trả lời:


258

Không. Không có tùy chọn như vậy có sẵn từ Oracle SQL Developer.

Bạn phải thực hiện một truy vấn bằng tay hoặc sử dụng công cụ khác (Ví dụ: PLQuery Developer có tùy chọn như vậy). SQL sau đây là SQL được sử dụng bởi PLQuery Developer:

select table_name, constraint_name, status, owner
from all_constraints
where r_owner = :r_owner
and constraint_type = 'R'
and r_constraint_name in
 (
   select constraint_name from all_constraints
   where constraint_type in ('P', 'U')
   and table_name = :r_table_name
   and owner = :r_owner
 )
order by table_name, constraint_name

Trong trường hợp r_ownerlà lược đồ, và r_table_namelà bảng mà bạn đang tìm kiếm tài liệu tham khảo. Tên là trường hợp nhạy cảm


Hãy cẩn thận vì trên tab báo cáo của Oracle SQL Developer có tùy chọn "Tất cả các bảng / Phụ thuộc", đây là từ ALL_DEPENDENCIES đề cập đến " sự phụ thuộc giữa các thủ tục, gói, hàm, thân gói và trình kích hoạt có thể truy cập được đối với người dùng hiện tại, bao gồm cả phụ thuộc trên các khung nhìn được tạo mà không có bất kỳ liên kết cơ sở dữ liệu nào. " . Sau đó, báo cáo này không có giá trị cho câu hỏi của bạn.


30
Cảm ơn câu trả lời. Xấu hổ về nhà phát triển Oracle Sql vì mút tay.
Greg

1
Bạn đã đề cập đến PLQuery Developer có thể thực hiện chức năng này, bạn có thể giải thích như thế nào không?
Nicholas

4
@Nicholas, Trong trình duyệt đối tượng, chọn một bảng, nhấp chuột phải vào bảng và chọn "Tham chiếu khóa ngoài"
FerranB

3
Câu trả lời này tham chiếu rằng SQL Developer 4.1 trở lên có tùy chọn tab "Model" sẽ hiển thị thông tin này ở định dạng ERD.
SnoredFrog

1
r_owner là lược đồ bạn đang sử dụng, r_table_name là bảng mà bạn đang tìm kiếm tài liệu tham khảo
Flowy

108

Để thêm phần này vào SQL Developer dưới dạng phần mở rộng, hãy làm như sau:

  1. Lưu mã dưới đây vào một tệp xml (ví dụ: fk numf.xml):
<items>
    <item type="editor" node="TableNode" vertical="true">
    <title><![CDATA[FK References]]></title>
    <query>
        <sql>
            <![CDATA[select a.owner,
                            a.table_name,
                            a.constraint_name,
                            a.status
                     from   all_constraints a
                     where  a.constraint_type = 'R'
                            and exists(
                               select 1
                               from   all_constraints
                               where  constraint_name=a.r_constraint_name
                                      and constraint_type in ('P', 'U')
                                      and table_name = :OBJECT_NAME
                                      and owner = :OBJECT_OWNER)
                               order by table_name, constraint_name]]>
        </sql>
    </query>
    </item>
</items>
  1. Thêm phần mở rộng cho SQL Developer:

    • Công cụ> Tùy chọn
    • Cơ sở dữ liệu> Tiện ích mở rộng do người dùng xác định
    • Nhấp vào nút "Thêm hàng"
    • Trong Loại chọn "EDITOR", Vị trí là nơi bạn đã lưu tệp xml ở trên
    • Nhấp vào "Ok" sau đó khởi động lại SQL Developer
  2. Điều hướng đến bất kỳ bảng nào và bây giờ bạn sẽ thấy một tab bổ sung bên cạnh SQL, được gắn nhãn Tham chiếu FK, hiển thị thông tin FK mới.

  3. Tài liệu tham khảo


Bạn có biết tên nút là gì cho Gói không? Tất cả các liên kết xsd tôi tìm thấy trên web không còn hợp lệ (như trong Oracle đã xóa chúng).
James Sumners

1
Tôi đã thêm một thay đổi nhỏ vào đề xuất của bạn: và chủ sở hữu = người dùng trước khi đặt hàng, để nếu bạn có hai phiên bản của cùng một bảng trong hai lược đồ, bạn chỉ nhận được các tham chiếu có liên quan đến lược đồ của mình
user1708042

Tôi đã thêm điều kiện này: and owner = :OBJECT_OWNERtrước đây and exists.
M Denis

3
@ M-Denis, trong trường hợp này bạn có thể bỏ lỡ các tài liệu tham khảo từ các lược đồ khác.
Bạn vào

sau khi áp dụng điều này và chạy describe books;select * from books;, nó không hiển thị tab tham chiếu fk trên máy ảo nhà phát triển sql của Oracle.
mLstudent33

36

Thay thế [BẢNG của bạn] bằng emp trong truy vấn bên dưới

select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_name
  from all_constraints 
 where constraint_type='R'
   and r_constraint_name in (select constraint_name 
                               from all_constraints 
                              where constraint_type in ('P','U') 
                                and table_name='[YOUR TABLE]');

Tôi nghĩ constraint_type in ('P','U') là không cần thiết, bởi vì nếu ràng buộc_type của ràng buộc TOTO là 'R', thì r_constraint_name của TOTO tất nhiên là tên của một ràng buộc loại 'P' HOẶC 'U' trong bảng được tham chiếu. Không cần phải xác định nó. Bạn đang sử dụng một IN, vì vậy nó cũng giống như rất nhiều ORvà chúng tôi chỉ quan tâm đến toán hạng duy nhất của OR đánh giá là đúng.
Gab 是

10

Bạn có thể truy vấn điều này từ ALL_CONSTRAINTSchế độ xem:

SELECT table_name
FROM ALL_CONSTRAINTS
WHERE constraint_type = 'R' -- "Referential integrity"
  AND r_constraint_name IN
    ( SELECT constraint_name
      FROM ALL_CONSTRAINTS
      WHERE table_name = 'EMP'
        AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key"
    );

1
Khóa ngoại có thể tham chiếu Khóa duy nhất, không chỉ các khóa chính, ngoài ra, tên bảng có thể được sử dụng trong nhiều lược đồ dẫn đến nhiều kết quả khớp. Bạn cũng cần sử dụng cột 'Chủ sở hữu' nếu bạn sẽ sử dụng 'All_Constraint' chứ không phải 'User_Constraint'.
Mark Roddy

Cảm ơn bạn đã nhận xét 'R' 'U' và 'P' là gì
Jeff

Đừng quên dấu chấm phẩy ở cuối yêu cầu SQL.
Gab 是

Nhân tiện, ràng buộc trong ('P', 'U') là không cần thiết, bởi vì nếu ràng buộc_type của một ràng buộc TOTO là 'R', thì r_constraint_name của TOTO tất nhiên là tên của một ràng buộc loại 'P' HOẶC ' 'trong bảng tham chiếu. Không cần phải xác định nó.
Gab 是

9

SQL Developer 4.1, được phát hành vào tháng 5 năm 2015, đã thêm một tab Model hiển thị các khóa ngoại bảng tham chiếu đến bảng của bạn theo định dạng Sơ đồ mối quan hệ thực thể.


1
Ít hữu ích hơn nếu bạn cần điều này trong một kịch bản vì một số lý do, nhưng nếu bạn chỉ cần biết về các kết nối thì đây có vẻ là cách hiện đại.
SnoredFrog

1
@SnoringFrog về mặt kỹ thuật câu hỏi yêu cầu một yếu tố UI vì vậy đây là câu trả lời phù hợp nhất
WhatsThePoint

4

Còn những thứ như thế này thì sao:

SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name
  FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name)
 WHERE c.table_name = <TABLE_OF_INTEREST>
   AND c.constraint_TYPE = 'R';

2
Điều này làm việc cho tôi khi tôi thay đổi tên bảng từ dba_constraintsthành all_constraintsthích:SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu

4
SELECT DISTINCT table_name, 
                constraint_name, 
                column_name, 
                r_table_name, 
                position, 
                constraint_type 
FROM   (SELECT uc.table_name, 
               uc.constraint_name, 
               cols.column_name, 
               (SELECT table_name 
                FROM   user_constraints 
                WHERE  constraint_name = uc.r_constraint_name) r_table_name, 
               (SELECT column_name 
                FROM   user_cons_columns 
                WHERE  constraint_name = uc.r_constraint_name 
                       AND position = cols.position)           r_column_name, 
               cols.position, 
               uc.constraint_type 
        FROM   user_constraints uc 
               inner join user_cons_columns cols 
                       ON uc.constraint_name = cols.constraint_name 
        WHERE  constraint_type != 'C') 
START WITH table_name = '&&tableName' 
           AND column_name = '&&columnName' 
CONNECT BY NOCYCLE PRIOR table_name = r_table_name 
                         AND PRIOR column_name = r_column_name; 

Điều này cực kỳ hữu ích - hiển thị đệ quy tất cả các bảng từ một bảng gốc nhất định, giữ một khóa là giá trị của một cột bạn chọn trong bảng gốc này. Tuyệt vời, cảm ơn.
Ev0oD

Điều đó thật tuyệt - công việc tốt. Tôi sẽ chỉ thêm thấp hơn () để so sánh tên_bảng và tên_bảng.
Tobias Otto

4

Điều này đã có trong sản phẩm trong nhiều năm - mặc dù nó không có trong sản phẩm vào năm 2011.

Nhưng, chỉ cần nhấp vào trang Mô hình.

Đảm bảo bạn đang sử dụng ít nhất phiên bản 4.0 (phát hành năm 2013) để truy cập tính năng này.

nhập mô tả hình ảnh ở đây


0

Để thêm vào câu trả lời ở trên cho plugin nhà phát triển sql, sử dụng xml bên dưới sẽ giúp lấy cột được liên kết với khóa ngoại.

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         where  a.constraint_type = 'R'
                                and exists(
                                   select 1
                                   from   all_constraints
                                   where  constraint_name=a.r_constraint_name
                                          and constraint_type in ('P', 'U')
                                          and table_name = :OBJECT_NAME
                                          and owner = :OBJECT_OWNER)
                                   order by table_name, constraint_name]]>
            </sql>
        </query>
        </item>
    </items>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.