2009-06-12 30 views
5

Cú pháp điển hình cho việc tạo ra một liên kết db như sau:Oracle Cú pháp cho việc tạo ra cơ sở dữ liệu liên kết Thuộc sở hữu của một người dùng khác

create database link remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 

Nhưng tôi muốn liên kết DB của tôi thuộc sở hữu của một tài khoản khác sau khi nó được tạo ra. Có cách nào để làm việc này không?

Sau đây KHÔNG làm việc:

create database link anotheruser.remote_db_link 
connect to remote_user 
identified by remote_password 
using 'remote_db' 
+0

Câu trả lời "được chọn" cho biết "bạn không thể tạo liên kết cơ sở dữ liệu trong lược đồ của người dùng khác". Điều này là không đúng sự thật. Có IS "cú pháp Oracle" có thể thực hiện điều này. Xem câu trả lời của tôi. – spencer7593

Trả lời

8

Restrictions on DBLinks - Bạn không thể tạo một liên kết cơ sở dữ liệu trong schema của người dùng khác, và bạn không thể đủ điều kiện dblink với tên của một lược đồ.

+0

:-(Tôi sợ điều đó.Cảm ơn tất cả vì thời gian của bạn – Jeff

+0

Thực ra, có thể tạo liên kết cơ sở dữ liệu trong lược đồ của người dùng khác – spencer7593

13

Sathya đúng, trong đó cú pháp CREATE DATABASE LINK không cho phép tạo liên kết cơ sở dữ liệu trong lược đồ khác. TUY NHIÊN ...

CÁCH GIẢI QUYẾT

có thể tạo ra một liên kết cơ sở dữ liệu trong schema của người dùng khác, miễn là anotheruserCREATE DATABASE LINK đặc quyền, và người dùng mà bạn đang kết nối như có CREATE ANY PROCEDURE đặc quyền.

Đây là workaround tôi sử dụng:

 
    create procedure anotheruser."tmp_doit_200906121431" 
    is 
    begin 
     execute immediate ' 
     create database link remote_db_link 
     connect to remote_user 
     identified by remote_password 
     using ''remote_db'' '; 
    end; 
    /
    begin 
     anotheruser."tmp_doit_200906121431"; 
    end; 
    /
    drop procedure anotheruser."tmp_doit_200906121431" 
    /

Hãy thư giãn mà. Đầu tiên, tôi tạo một thủ tục trong lược đồ của anotherusers; thủ tục này chứa câu lệnh CREATE DATABASE LINK mà tôi muốn chạy.

Khi thủ tục được thực hiện, nó chạy với tư cách chủ sở hữu của quy trình, sao cho câu lệnh CREATE DATABASE LINK được thực thi bởi anotheruser.

Tên của quy trình không quan trọng, ngoại trừ việc tôi cần đảm bảo rằng nó không xung đột với bất kỳ tên đối tượng hiện có nào. Tôi sử dụng chữ thường (kèm theo tên thủ tục trong dấu ngoặc kép), sử dụng "tmp" để đánh dấu đối tượng này là "tạm thời" và sử dụng yyyymmddhh24miss hiện tại làm một phần của tên thủ tục. (Tôi thường chạy truy vấn DBA_OBJECTS để kiểm tra xem một đối tượng trùng khớp không tồn tại.)

Đối với chức năng quản trị kiểu "một lần", đây là giải pháp khả thi. Tôi thích điều này để thay thế khác: lưu mật khẩu của người khác, thay đổi mật khẩu, kết nối với tư cách người dùng và đặt lại mật khẩu của người khác lại thành lưu.)

+0

Chà, giải pháp tuyệt vời ... Cảm ơn rất nhiều! – kupa

+0

Bạn đang –

-2

Là người dùng sys bạn có thể xem tất cả liên kết db trong SYS.DBA_DB_LINKS lượt xem. Chế độ xem đó sử dụng liên kết $ và bảng $ user. Bạn có thể tạo dblink mới như thường lệ và nó hiển thị tại liên kết $ table. Sau đó thay đổi chủ sở hữu (sử dụng id từ người dùng $). cam kết. Làm xong.

+0

Cảm ơn bạn đã trả lời nhưng câu hỏi này có câu trả lời đã được chấp nhận – alestanis

+0

Lưu ý rằng cách tiếp cận được mô tả trong câu trả lời này là * không * được hỗ trợ bởi Oracle.Oracle mạnh dạn cảnh báo chống lại việc phát hành DML để sửa đổi nội dung của các bảng trong lược đồ SYS, ngoại trừ dưới sự hỗ trợ của Oracle. – spencer7593