Trong SQL Server, có thể lấy DB_ID
từ ngữ cảnh từ xa hơn ngăn xếp cuộc gọi không?
Mục tiêu của tôi là tạo ra một số chức năng tiện ích (và được thừa nhận là hacky) trong cơ sở dữ liệu dev sandbox giúp dễ dàng và ngắn gọn để có được tên đầy đủ của các đối tượng được đặt tên ngắn hoặc phân mảnh và thêm vào đó để xóa các đối tượng sử dụng cùng tên ngắn . Các chức năng tiện ích này sẽ nằm trong một cơ sở dữ liệu tiện ích duy nhất nhưng được gọi từ các cơ sở dữ liệu khác trên cùng một máy chủ.
Từ những gì tôi có thể thấy từ thử nghiệm:
ORIGINAL_DB_NAME()
như dự định trả về bất cứ thứ gì có trong chuỗi kết nối, không phải bối cảnh hiện tại (được đặt bởiUSE [dbname]
).- Khi được gọi trong một hàm
DB_NAME()
trả về tên của cơ sở dữ liệu nơi hàm đó được xác định . Một cách khác để nói điều này là bối cảnh bên trong một hàm hoặc thủ tục được lưu trữ là của cơ sở dữ liệu được xác định
Tôi biết công cụ theo dõi từng bối cảnh cơ sở dữ liệu lên và xuống ngăn xếp cuộc gọi (xem bên dưới để chứng minh). Vì vậy, có cách nào để truy cập thông tin này?
Tôi muốn có thể tìm và vận hành trên các đối tượng trong ngữ cảnh của cơ sở dữ liệu của người gọi, mặc dù mã thực thi không nằm trong cùng một cơ sở dữ liệu. Ví dụ:
use SomeDB
EXEC util.dbo.frobulate_table 'my_table'
Tôi biết tôi có thể làm
EXEC util.dbo.frobulate_table 'SomeDB.dbo.my_table'
Nhưng tôi thực sự tò mò nếu có thể truy vấn ngăn xếp cuộc gọi theo cách này.
Cập nhật / ghi chú
Tôi đã đọc và tải mã từ blog của Gabriel McAdams . Điều này cung cấp một bản ghi ID thủ tục gọi lên và xuống ngăn xếp nhưng vẫn cho rằng mọi thứ đều nằm trong cùng một cơ sở dữ liệu.
Bằng chứng SQL Server ghi nhớ bối cảnh DB lên và xuống ngăn xếp cuộc gọi
Ví dụ: Trên máy chủ dev có cơ sở dữ liệu TestDB1 và TestDB2
use TestDB1
GO
CREATE FUNCTION dbo.ECHO_DB_NAME() RETURNS nvarchar(128) BEGIN RETURN DB_NAME() END
GO
use TestDB2
GO
CREATE PROCEDURE dbo.ECHO_STACK AS
BEGIN
DECLARE @name nvarchar(128)
SET @name = DB_NAME()
PRINT 'Before, DB_NAME inside dbo.ECHO_STACK : ' + @name
SET @name = TestDB1.dbo.ECHO_DB_NAME()
PRINT 'TestDB1.dbo.ECHO_DB_NAME returned : ' + @name
SET @name = DB_NAME()
PRINT 'After, DB_NAME inside dbo.ECHO_STACK : ' + @name
END
GO
use master
SELECT DB_NAME() -- Returns 'master'
EXEC TestDB2.dbo.ECHO_STACK
Bản in ECHO_STACK Proc:
Before, DB_NAME inside dbo.ECHO_STACK : TestDB2
TestDB1.dbo.ECHO_DB_NAME returned : TestDB1
After, DB_NAME inside dbo.ECHO_STACK : TestDB2
DROP
câu lệnh.
USE xyz;
trước nó?