2009-06-03 34 views

Trả lời

30

Bạn có thể truy vấn các ALL_OBJECTS xem:

select owner 
    , object_name 
    , object_type 
    from ALL_OBJECTS 
where object_name = 'FOO' 

Để tìm từ đồng nghĩa:

select * 
    from ALL_SYNONYMS 
where synonym_name = 'FOO' 

Chỉ cần làm rõ, nếu câu lệnh SQL một dùng của người dùng tham chiếu một tên đối tượng không có trình độ chuyên môn schema (ví dụ 'FOO'), Oracle FIRST kiểm tra lược đồ của người dùng cho một đối tượng của tên đó (bao gồm các từ đồng nghĩa trong lược đồ của người dùng đó). Nếu Oracle không thể giải quyết tham chiếu từ lược đồ của người dùng, Oracle sẽ kiểm tra từ đồng nghĩa chung.

Nếu bạn đang tìm kiếm đặc biệt cho những hạn chế trên một tên_bảng cụ thể:

select c.* 
    from all_constraints c 
where c.table_name = 'FOO' 
union all 
select cs.* 
    from all_constraints cs 
    join all_synonyms s 
    on (s.table_name = cs.table_name 
    and s.table_owner = cs.owner 
    and s.synonym_name = 'FOO' 
     ) 

HTH

- phụ lục:

Nếu người dùng của bạn được cấp quyền truy cập vào các quan điểm DBA_ (ví dụ như nếu bạn người dùng đã được cấp SELECT_CATALOG_ROLE), bạn có thể thay thế 'DBA_' thay cho 'ALL_' trong các ví dụ SQL trước. Chế độ xem ALL_x chỉ hiển thị các đối tượng mà bạn đã được cấp đặc quyền. Chế độ xem DBA_x sẽ hiển thị tất cả các đối tượng cơ sở dữ liệu, cho dù bạn có đặc quyền đối với chúng hay không.

+0

Chỉ cần để thực hiện các truy vấn linh hoạt hơn một chút, tôi sẽ sẽ truy vấn 'nơi thấp hơn (object_name) =' foo'' Điều này đặc biệt hữu ích khi bạn có tên chức năng, nhưng không phải là viết hoa (ví dụ như từ một cuộc gọi trong một chương trình bên ngoài không phân biệt chữ hoa chữ thường, như trường hợp của bản thân mình). – Travis

+0

@Travis: điều đó sẽ làm cho truy vấn linh hoạt hơn. Để kết hợp chặt chẽ hơn cách Oracle thấy các mã định danh "phân biệt chữ hoa chữ thường" trong câu lệnh SQL, chúng ta muốn ** 'WHERE object_name = UPPER ('foo')' **. (Một định danh không kèm theo trong các dấu ngoặc kép trong một câu lệnh SQL được Oracle xem như là trường hợp trên. (Oracle identifiers * là * case sensitive), chúng ta chỉ cần đặt chúng trong dấu ngoặc kép trong câu lệnh SQL để bảo vệ chữ thường Khi chúng ta thực hiện 'SELECT * FROM foo', Oracle thực sự thấy định danh là' FOO', như thể chúng ta đã thực hiện 'SELECT * FROM FOO'.) – spencer7593

2

câu hỏi thú vị - Tôi không nghĩ rằng có bất kỳ chức năng Oracle thực hiện điều này (gần giống như một "mà" lệnh trong Unix), nhưng bạn có thể nhận được thứ tự độ phân giải cho tên theo:

select * from 
(
select object_name objname, object_type, 'my object' details, 1 resolveOrder 
    from user_objects 
    where object_type not like 'SYNONYM' 
union all 
select synonym_name obj , 'my synonym', table_owner||'.'||table_name, 2 resolveOrder 
    from user_synonyms 
union all 
select synonym_name obj , 'public synonym', table_owner||'.'||table_name, 3 resolveOrder 
    from all_synonyms where owner = 'PUBLIC' 
) 
where objname like upper('&objOfInterest') 
1

Để tìm tên của người dùng hiện tại trong phiên Oracle, hãy sử dụng hàm USER.

Lưu ý rằng chủ sở hữu của ràng buộc, chủ sở hữu của bảng chứa khóa ngoại, và chủ sở hữu của bảng được tham chiếu có thể khác nhau. Nghe có vẻ như nó ’ là chủ sở hữu bảng bạn ’ lại quan tâm đến, trong trường hợp này nên được gần gũi với những gì bạn muốn:

select Constraint_Name 
from All_Constraints 
where Table_Name = 'WHICHEVER_TABLE' 
    and Constraint_Type = 'R' and Owner = User; 
1

quan điểm Oracle như ALL_TABLES và ALL_CONSTRAINTS có một cột chủ sở hữu, mà bạn có thể sử dụng để hạn chế truy vấn của bạn. Ngoài ra còn có các biến thể của các bảng này bắt đầu bằng USER thay vì ALL, chỉ liệt kê các đối tượng có thể được truy cập bởi người dùng hiện tại.

Một trong số these lượt xem sẽ giúp giải quyết vấn đề của bạn. Họ luôn làm việc tốt cho tôi vì những vấn đề tương tự.

0

Tôi tìm thấy câu hỏi này là kết quả hàng đầu trong khi Googling cách tìm chủ sở hữu bảng trong Oracle, vì vậy tôi nghĩ rằng tôi sẽ đóng góp một câu trả lời cụ thể cho người khác.

Để tìm chủ sở hữu của một bảng cụ thể trong một Oracle DB, sử dụng các truy vấn sau đây:

select owner from ALL_TABLES where TABLE_NAME ='<MY-TABLE-NAME>'; 
Các vấn đề liên quan