2011-07-02 45 views
6

Tôi đang cố gắng hiểu cách tôi có thể sử dụng bí danh để tham chiếu cơ sở dữ liệu khác trong cùng một trường hợp, mà không phải sử dụng tên mã cứng.Bí danh cơ sở dữ liệu chéo của SQL Server

Kịch bản như sau:

Tôi có db dữ liệu với dữ liệu lưu trữ, một db kiểm tra giữ mọi thay đổi được thực hiện. vì nhiều lý do khác nhau, tôi muốn giữ dữ liệu kiểm toán trong một cơ sở dữ liệu riêng biệt, ít nhất vì nó có thể khá lớn và cho mục đích báo cáo. Trong db dữ liệu, tôi không muốn tham chiếu điều này bằng tên mã hóa cứng nhưng một bí danh để trong các môi trường khác nhau, tôi không phải thay đổi tên và các sp khác nhau để tham chiếu đến tên mới.

ví dụ:

mydevdata 
mydevaudit 

Nếu một sp tồn tại trong mydevdata như trong đó kêu gọi các mydevaudit, tôi không muốn thay đổi sp khi tôi đi đến kiểm tra nơi của db có thể được gọi mytestdatamytestaudit . Một lần nữa, vì nhiều lý do, tên cơ sở dữ liệu có thể thay đổi, nhiều việc phải làm với các không gian một trường hợp, vv

Vì vậy, nếu tôi có thủ tục trong mydevdata:

proc A 
begin 

insert into mydevaudit.table.abc(somecol) 
select 1 

end 

khi tôi đi để kiểm tra, tôi không muốn được thay đổi các thủ tục để tham khảo một tên khác, (giả định vì lợi ích của lập luận cho rằng đã xảy ra)

thay vào đó tôi tìm cách để làm điều gì đó như:

proc A 
begin 

insert into AUDITEBALIAS.table.abc(somecol) 
select 1 

end 

tôi quan tâm đến việc tìm ra cách tôi có thể làm điều gì đó như thế, và sự ủng hộ và chống đối.

Ngoài ra, SQL từ tính không phải là một tùy chọn.

cảm ơn trước sự giúp đỡ của bạn.

+0

xin vui lòng bạn có thể giải thích tại sao "SQL dymnamic không phải là một lựa chọn" – Seph

Trả lời

11

Bạn có thể sử dụng synonyms

CREATE SYNONYM WholeTableAliasWithDBetc FOR TheDB.dbo.TheTable 

Điều này có nghĩa tất cả các tài liệu tham khảo đối tượng trong DB địa phương là cục bộ đối DB rằng, ngoại trừ cho các từ đồng nghĩa rằng ẩn cơ sở dữ liệu khác từ bạn.

Bạn cũng có thể sử dụng các thủ tục được lưu trữ trong DB kiểm tra. Có một hình thức thứ 3 của EXEC được ít sử dụng, nơi bạn có thể parametrise tên proc lưu trữ

DECLARE @module_name_var varchar(100) 
SET @module_name_var = 'mydevaudit.dbo.AuditProc' 
-- SET @module_name_var = 'whatever.dbo.AuditProc' 
EXEC @module_name_var @p1, @p2, ... 

Rõ ràng bạn có thể thay đổi module_name_var sử dụng bất cứ DB bạn thích

0

Tôi vừa mới đăng tải này để How to create Sql Synonym or "Alias" for Database Name? mà là một giải pháp cho cùng một trường hợp:

Có một cách để mô phỏng điều này bằng máy chủ được liên kết. Điều này giả định rằng bạn có hai máy chủ SQL với cùng một bộ cơ sở dữ liệu một cho phát triển/thử nghiệm và một cơ sở dữ liệu.

  1. mở SQL Server Management Studio trên máy chủ phát triển/kiểm tra của bạn
  2. Nhấp chuột phải Máy chủ Objects> Servers Liên Kết
  3. Chọn New Linked Server ...
  4. Chọn trang chung
  5. Chỉ định bí danh tên trong trường Máy chủ được liên kết - đây thường sẽ là tên của sống máy chủ
  6. của bạn
  7. Chọn SQL Native Client là nhà cung cấp
  8. Nhập sql_server cho Tên sản phẩm
  9. Trong Data Source chỉ định tên của sự phát triển máy chủ
  10. Thêm An ninh và Server Options để nếm
  11. Bấm OK

Ở trên là dành cho SQL Server 2005 nhưng phải tương tự cho năm 2008

Một khi bạn đã làm điều đó bạn có thể viết SQL như thế này:

SELECT * FROM liveservername.databasename.dbo.tablename 

Bây giờ khi kịch bản của bạn đang chạy trên máy chủ phát triển với máy chủ liên kết trở lại bản thân họ sẽ làm việc một cách chính xác kéo dữ liệu từ máy chủ phát triển và khi các kịch bản chính xác giống nhau được chạy trên máy chủ trực tiếp, chúng sẽ hoạt động bình thường.

Các vấn đề liên quan