Gần đây, một trong những khách hàng của chúng tôi đã gặp sự cố khi cố gắng chèn một số dữ liệu Oracle® vào bảng SQL Server. Chèn không thành công vì bảng đích trong phiên bản SQL Server không có trong cơ sở dữ liệu mà khách hàng đang kết nối.
Cuối cùng, giải pháp cho vấn đề này là giải pháp đơn giản nhất. Trình khắc phục sự cố này bao gồm giải pháp này và các giải pháp khác, nhằm cố gắng trình bày danh sách các bản sửa lỗi tiềm năng cho sự cố theo thứ tự hợp lý. Mặc dù trình khắc phục sự cố dựa trên trình điều khiển Easysoft ODBC sử dụng SQL Server làm cơ sở dữ liệu đích của nó, nhiều bước có thể áp dụng cho các trình điều khiển dựa trên unixODBC cho cơ sở dữ liệu khác.
- Kiểm tra nguồn dữ liệu (DSN) cho cơ sở dữ liệu mục tiêu của bạn.
Điều này thường sẽ được định nghĩa trong /etc/odbc.ini.
Quan trọng Đừng bỏ qua các bước này chỉ vì DSN của bạn là bản sao từ thiết lập đang hoạt động trên một máy khác. Đặc biệt nếu thiết lập hoạt động đó nằm trên nền tảng khác và / hoặc sử dụng phiên bản trình điều khiển khác. Các phiên bản khác nhau của trình điều khiển ODBC có thể phân tích cú pháp tệp odbc.ini khác nhau, ví dụ:một số có thể sử dụng phiên bản cuối cùng của thuộc tính DSN hoặc DSN mà họ tìm thấy khi có bản sao, một số có thể sử dụng phiên bản cuối cùng. Ngoài ra, một trình điều khiển khác trên một nền tảng khác có thể ngừng phân tích cú pháp tệp odbc.ini nếu có một ký tự sự cố trong tệp, chẳng hạn như ký tự xuống dòng.
- Kiểm tra để đảm bảo rằng chỉ có một bản sao của nguồn dữ liệu. Nếu có nhiều phiên bản của nguồn dữ liệu, hãy đổi tên chúng hoặc xóa các phiên bản khác. Tức là bạn muốn cái này:
[MYDSN] Database=MYDB
—Hay—
[MYDSN1] Database=MYDB1 [MYDSN2] Database=MYDB2
Không
[MYDSN] Database=MYDB [MYDSN] Database=MYDB
- Khi bạn chắc chắn rằng bạn chỉ có một bản sao của DSN, hãy kiểm tra xem DSN chỉ có dòng chỉ định cơ sở dữ liệu đích. Tức là bạn muốn cái này:
[MYDSN] Database=MYDB Server=MYMACHINE . . . [ANOTHERDSN]
Không
[MYDSN] Database=MYDB Server=MYMACHINE Database=MYDB2 . . . [ANOTHERDSN]
—Hay—
[MYDSN] Database=MYDB Server=MYMACHINE Database= . . . [ANOTHERDSN]
- Kiểm tra để đảm bảo rằng chỉ có một bản sao của nguồn dữ liệu. Nếu có nhiều phiên bản của nguồn dữ liệu, hãy đổi tên chúng hoặc xóa các phiên bản khác. Tức là bạn muốn cái này:
- Nếu bạn không chỉ định cơ sở dữ liệu một cách rõ ràng, hãy kiểm tra với DBA của bạn xem cơ sở dữ liệu mặc định cho người dùng của bạn có phải là cơ sở dữ liệu bạn nghĩ hay không. Ví dụ:trong SQL Server, bạn có thể định cấu hình đăng nhập để kết nối với một cơ sở dữ liệu cụ thể, vì vậy trong:
[MYDSN] Database=MYDB Server=MYMACHINE User=MYUSER. . . [ANOTHERDSN]
MYUSER ban đầu có thể kết nối để nói, AdventureWorks nếu thông tin đăng nhập đã được định cấu hình cho một cơ sở dữ liệu cụ thể hoặc cơ sở dữ liệu Master nếu chưa.
- Kiểm tra xem bạn có đang kết nối với DSN mà bạn cho rằng mình đang sử dụng hay không. Ngay cả khi bạn đã thêm DSN của mình vào phiên bản có trước của /etc/odbc.ini, điều đó không có nghĩa là trình quản lý trình điều khiển của bạn đang tìm kiếm trong tệp này. Tùy thuộc vào cách trình quản lý trình điều khiển được xây dựng hoặc môi trường được thiết lập, nó có thể đang tìm kiếm ở một vị trí khác. Để kiểm tra, hãy thử nhận xét thuộc tính Trình điều khiển trong nguồn dữ liệu. Nếu bạn vẫn có thể kết nối, bạn đang sử dụng phiên bản DSN khác. Sử dụng một chương trình như strace hoặc truss để tìm ra tệp odbc.ini nào đang được sử dụng. Ví dụ:
$ more /etc/odbc.ini [MYDSN] #Driver=Easysoft ODBC-SQL Server $ /usr/local/easysoft/unixODBC/bin/isql.sh -v MYDSN SQL> $ strace -o -f /tmp/odbc.log /usr/local/easysoft/unixODBC/bin/isql.sh -v MYDSN $ grep odbc.ini /tmp/odbc.log
Nếu bạn đã sao chép DSN từ một máy khác, hãy thử lặp lại quy trình này trên máy đó để xác minh vị trí của DSN nguồn.
- Kiểm tra để đảm bảo rằng bạn đang kết nối với DBMS mà bạn nghĩ. Ví dụ, nếu nó không quá gián đoạn, hãy thử tạm dừng / dừng phiên bản / dịch vụ đích cho DBMS. Nếu bạn vẫn có thể kết nối, bạn đang kết nối với DBMS trên một máy khác. Có lẽ mạng của bạn đã được định cấu hình để một máy khác có thể có cùng địa chỉ IP với địa chỉ IP được chỉ định trong DSN.
- Trong isql, nhập "help". Trong danh sách các bảng được trả về, tên cơ sở dữ liệu nào được hiển thị? Nó có phải là một trong những bạn mong đợi? Nếu không, điều gì sẽ xảy ra nếu bạn nhập:
use database
Thay thế cơ sở dữ liệu với tên của cơ sở dữ liệu đích. Nếu bạn không thể thay đổi cơ sở dữ liệu, hãy kiểm tra với DBA của bạn xem có trình kích hoạt đăng nhập kiểm soát quyền truy cập vào cơ sở dữ liệu theo địa chỉ IP hay không. Trong SQL Server Management Studio, trình kích hoạt đăng nhập dưới INSTANCE > Đối tượng máy chủ> Trình kích hoạt.