2011-10-20 22 views
11

Tôi hiện đang gặp sự cố trong đó tôi không thể tham chiếu bảng trong cơ sở dữ liệu được liên kết trong một thủ tục được lưu trữ. Tôi nhận được thông báo lỗi:Oracle: Sử dụng liên kết cơ sở dữ liệu trong một thủ tục lưu sẵn: bảng hoặc dạng xem không tồn tại

ORA-00942: table or view does not exist

Dưới đây là các bước tôi đã trên máy chủ (chạy oracle 10g) để thiết lập các liên kết cơ sở dữ liệu cơ sở dữ liệu từ xa (chạy oracle 11g). Các bước là chính xác, nhưng một số tên đã được thay đổi, mặc dù chúng đã được giữ nhất quán.

  1. Cập nhật tnsnames.ora, thêm một mục mới:

    REMOTE_DB = 
        (DESCRIPTION = 
         (ADDRESS = (PROTOCOL = TCP) 
            (HOST = 10.10.10.10) 
            (QUEUESIZE = 20) 
            (PORT = 1521) 
         ) 
         (CONNECT_DATA = 
            (SERVICE_NAME = remote_service) 
         ) 
        ) 
    
  2. Tạo liên kết cơ sở dữ liệu, như người sử dụng người sau này sẽ được tạo ra và thực hiện các thủ tục lưu trữ:

    create database link remote_link 
    connect to "remote_user" 
    identified by "remote_pass" 
    using 'REMOTE_DB'; 
    
  3. Chứng chỉ liên kết cơ sở dữ liệu đang hoạt động bằng cách chọn từ đó:

    select id from [email protected]_link; 
    
    id 
    -------------------------------------------------------------------------------- 
    8ac6eb9b-fcc1-4574-8604-c9fd4412b917 
    c9e7ee51-2314-4002-a684-7817b181267b 
    cc395a81-56dd-4d68-9bba-fa926dad4fc7 
    d6b450e0-3f36-411a-ba14-2acc18b9c008 
    
  4. Tạo thủ tục lưu trữ mà phụ thuộc vào liên kết cơ sở dữ liệu làm việc:

    create or replace 
    PROCEDURE test_remote_db_link 
    AS 
    v_id varchar(50); 
    BEGIN 
        select id into v_id from [email protected]_link where id = 'c9e7ee51-2314-4002-a684-7817b181267b'; 
        dbms_output.put_line('v_id : ' || v_id); 
    END test_remote_db_link; 
    
  5. Explode đầu riêng sau khi nhìn chằm chằm vào thông báo lỗi sau trong hơn cả một ngày làm việc:

    Error(10,27): PL/SQL: ORA-00942: table or view does not exist 
    

tôi đã thử nhiều cách để cố gắng sắp xếp vấn đề này, bao gồm:

  1. Khi tạo liên kết cơ sở dữ liệu, không sử dụng dấu ngoặc kép quanh tên người dùng và mật khẩu. Liên kết tạo ra tốt, nhưng chọn từ nó mang lại cho tôi lỗi này:

    ERROR at line 1: 
    ORA-01017: invalid username/password; logon denied 
    ORA-02063: preceding line from TWS_LINK 
    
  2. Đã thử kết hợp tên người dùng và mật khẩu khác nhau trên/chữ thường. Đã nhận được lỗi giống như 1.

  3. Trích dẫn một lần thử thay vì dấu ngoặc kép xung quanh tên người dùng và mật khẩu. Nhận được lỗi này:

    ERROR at line 1: 
    ORA-00987: missing or invalid username(s) 
    
  4. Chứng minh tôi có quyền truy cập đầy đủ vào db từ xa bằng cách kết nối vào nó với sqlplus:

    [oracle]$ sqlplus remote_user/[email protected]_DB 
    
    SQL*Plus: Release 10.2.0.1.0 - Production on Thu Oct 20 22:23:12 2011 
    
    Copyright (c) 1982, 2005, Oracle. All rights reserved. 
    
    
    Connected to: 
    Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - 64bit Production 
    With the Partitioning, OLAP, Data Mining and Real Application Testing options 
    
    SQL> 
    

Tôi không biết phải làm gì tiếp theo. Bước tiếp theo có thể là bắt đầu xem xét các vấn đề trên cơ sở dữ liệu từ xa và có thể xem liệu các cơ sở dữ liệu khác có thể kết nối với nó hay không. Khác sẽ là nhìn vào sự không tương thích đi từ máy chủ 10g đến 11g từ xa.

+1

Viết tốt. Rất rõ ràng. –

+0

Cùng một triệu chứng này có thể xảy ra nếu đặc quyền lựa chọn của bạn xuất phát từ vai trò.Bạn phải có trợ cấp trực tiếp trên một đối tượng để sử dụng nó trong một chương trình pl/sql. xem http://www.dba-oracle.com/concepts/roles_security.htm –

Trả lời

5

OK vì vậy tôi có thể làm việc này.

Nó chỉ ra rằng khi tạo liên kết cơ sở dữ liệu, dấu ngoặc kép xung quanh trường tên người dùng và mật khẩu đã gây ra sự cố. Để tóm tắt:

Nếu họ đã có mặt, và liên kết tạo ra như vậy:

create database link remote_link 
connect to "remote_user" 
identified by "remote_pass" 
using 'REMOTE_DB'; 
  1. Cơ sở dữ liệu từ xa thể được truy vấn thông qua sql
  2. Các thủ tục lưu trữ không thể được biên dịch , nhận được lỗi ORA-942
  3. Vì không thể biên dịch thủ tục, nên không thể thực hiện quy trình

Khi dấu ngoặc kép không được trình bày:

create database link remote_link 
connect to remote_user 
identified by remote_pass 
using 'REMOTE_DB'; 
  1. Cơ sở dữ liệu từ xa không có thể được truy vấn thông qua sql, recieving lỗi mật khẩu không hợp lệ (nêu chi tiết trong câu hỏi)
  2. Các thủ tục lưu trữ có thể được biên dịch không có lỗi.
  3. Quy trình được lưu thực thi như mong đợi, truy xuất dữ liệu từ toàn bộ liên kết cơ sở dữ liệu và hiển thị nó.

Vì vậy, mặc dù cơ sở dữ liệu từ xa không thể được truy vấn thông qua sql, nhận lỗi mật khẩu không hợp lệ, quy trình sử dụng thông tin kết nối này và thực hiện bình thường.

Tôi chắc chắn bạn sẽ đồng ý, đây là trạng thái kỳ lạ của các sự kiện và tôi thực sự tình cờ gặp phải nó hoạt động trong kịch bản của tôi. Tôi không hoàn toàn chắc chắn tôi sẽ gọi nó là một giải pháp, vì có rất nhiều câu hỏi chưa được trả lời.

Hy vọng rằng nếu ai đó đến đây qua google, họ sẽ tìm thấy câu trả lời này hữu ích và ít nhất là chạy mã của họ.

GC.

+0

Vẫn không thể để điều này xảy ra ... Có vẻ như mật khẩu trên 11g phân biệt chữ hoa chữ thường và lợi ích khi được đưa vào dấu ngoặc kép. Tìm thấy từ mục blog này: http://pbarut.blogspot.com/2008/08/db-link-to-oracle-11g.html – Clarkey

2

Tôi nghĩ rằng tôi thấy sự cố ở đây. Người dùng đang thực hiện thủ tục đã lưu trữ cùng một người dùng đã tạo thủ tục lưu sẵn chưa?

Bạn đã nói, "Tạo liên kết cơ sở dữ liệu, vì người dùng sau này sẽ được thực hiện quy trình được lưu trữ".

Nếu người dùng tạo liên kết cơ sở dữ liệu khác với người dùng tạo thủ tục được lưu trữ, đó có thể là vấn đề của bạn.

Thử tạo quy trình và liên kết cơ sở dữ liệu được lưu trữ với cùng một người dùng hoặc tạo liên kết cơ sở dữ liệu công khai.

Sau đó, vì mặc định của Oracle là quyền hủy bỏ, bạn có thể yêu cầu bất kỳ ai thực thi thủ tục được lưu trữ (giả sử họ đã được cấp đặc quyền thực hiện thủ tục).

+0

Xin chào, Cảm ơn bạn đã trả lời. Tôi đã thực hiện mọi thứ với cùng một người dùng, tức là tạo liên kết cơ sở dữ liệu và cố gắng tạo thủ tục với cùng một người dùng. Liên kết cơ sở dữ liệu công khai là một ý tưởng hay. Tôi sẽ thử tiếp theo. – Clarkey

+0

Bạn có gặp lỗi ORA-942 lúc biên dịch hay thời gian chạy không? (Tôi đoán compiletime?) –

+0

Có, tôi nhận được ORA-942 tại thời gian biên dịch. Tôi đã thử sử dụng một liên kết cơ sở dữ liệu công cộng, nhưng tôi nhận được các lỗi tương tự. Không có sự khác biệt đối với liên kết cơ sở dữ liệu thông thường: s – Clarkey

4

Tôi gặp vấn đề tương tự trên 11gR2 và tôi cảm ơn diễn đàn này đã giúp tôi tìm ra sự cố. Cách để làm cho liên kết db hoạt động trong cả SQL và thủ tục là làm theo cú pháp dưới đây (chỉ kèm theo mật khẩu trong dấu ngoặc kép).

create database link remote_link 
connect to remote_user 
identified by "remote_pass" 
using 'REMOTE_DB'; 
+0

Btw, tôi đã sử dụng 11g r2. – Sanjog