Truy vấn mà không phải xác định lược đồ của bảng


10

Tôi đã nhập một loạt các bảng từ SQL Server 2000 vào cơ sở dữ liệu năm 2008 của mình. Tất cả các bảng đã nhập được tiền tố với tên người dùng của tôi, ví dụ : erpadmin.tablename.

Trong các thuộc tính bảng, nó liệt kê 'erpadmin' dưới dạng lược đồ db. Khi tôi viết một truy vấn, bây giờ tôi phải bao gồm 'erpadmin.' ở phía trước của tất cả các tên bảng gây nhầm lẫn.

Kết quả hiện tại:

select *
from erpadmin.tablename

Kết quả như ý:

select *
from  tablename

Câu trả lời:


23

Nếu bạn muốn quay lại sử dụng lược đồ dbo như trong SQL Server 2000, bạn có thể di chuyển bảng trở lại lược đồ dbo:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

Một cách khác nếu bạn muốn có lược đồ không phải là dbo là đặt lược đồ mặc định của người dùng thành erpadminnếu bạn không chỉ định một lược đồ, nó sẽ sử dụng lược đồ đó làm mặc định. (Thành viên của vai trò máy chủ cố định sysadmin bỏ qua DEFAULT_SCHEMAvà sử dụng dbotheo mặc định.)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

Tên hai phần bạn có (lược đồ.table) là một thói quen tốt để tham gia, vì vậy bạn có thể rõ ràng với bảng mà bạn đang đề cập đến. Một số tính năng yêu cầu bạn sử dụng tên hai phần, Chế độ xem được lập chỉ mục là một ví dụ.


17

Đây là một trường hợp cổ điển về lý do tại sao bạn nên chỉ định tên lược đồ khi truy cập các đối tượng cơ sở dữ liệu. Khi nó không được chỉ định và bạn đang cố truy cập một đối tượng trong lược đồ không mặc định thì bạn sẽ gặp phải vấn đề mà bạn đang thấy ngay bây giờ.

Cách khắc phục thực sự là thay đổi ứng dụng của bạn (hoặc bất kỳ tác nhân truy vấn nào bạn có ngay bây giờ gây ra sự cố) rõ ràng.

Khi tôi viết một truy vấn, bây giờ tôi phải bao gồm 'erpadmin.' ở phía trước của tất cả các tên bảng gây nhầm lẫn.

Điều đó không khó hiểu, đó là một quy ước đặt tên rõ ràng . Tôi khuyên bạn nên gắn bó với danh pháp đó để tránh xáo trộn đối tượng và sự không nhất quán.


3
Một lý do khác để luôn sử dụng tên hai phần là để tránh trường hợp nhiều người dùng thực thi cùng một mã (ví dụ select ... from table5 ;) và nhận được các kết quả khác nhau. Điều này không tốt cho bộ nhớ đệm kế hoạch và cũng không tốt cho việc khắc phục sự cố (người hỗ trợ cue, "truy vấn đó chạy tốt ở đây"). Ngoài ra, schemabinding, được yêu cầu để lập chỉ mục các chức năng và khung nhìn, yêu cầu hai tên phần. TLDR: ngừng lười biếng - sử dụng tên hai phần.
Greenstone Walker

7

Ngoài câu trả lời @AdamWenger. Để tạo tập lệnh để chuyển sang lược đồ anothe, bạn có thể sử dụng tập lệnh sau

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

Rắc rối của bạn có thể là do cách di chuyển đã được thực hiện. Nội dung không nên được đính kèm với người dùng của bạn, trừ khi bạn được coi là chủ sở hữu.

Các lược đồ có mặt để giúp bạn tách các bảng bằng bất cứ điều gì có ý nghĩa. Giả sử bạn có một bảng tài nguyên cho khởi hành nhân sự và muốn có một bảng riêng cho bộ phận sản xuất, trong khi vẫn giữ cả hai trên cùng một cơ sở dữ liệu. Trong trường hợp đó, bạn có thể có hai bảng có tên là tài nguyên, một trong lược đồ sản xuất và một bảng khác trong lược đồ HR. Đó là lý do tại sao các shcemas phải được chỉ định, trừ khi bạn đưa công cụ vào lược đồ mặc định.

Nếu bạn không làm lại di chuyển vì một số lý do khác, thì chuyển nhượng của Adam Wenger sẽ là một lựa chọn khôn ngoan.


-2

Bắt đầu lệnh của bạn với USE [tablename] truy vấn của bạn không có cơ sở dữ liệu liên quan để tham chiếu và cơ sở dữ liệu bạn đang xem không phải là mặc định cho người dùng đã đăng nhập Ở đầu cửa sổ truy vấn có thể nói "chính"


3
Ý bạn là [database_name]đúng không?
dezso
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.