2009-07-17 41 views
6

Nếu Proc A thực thi Proc B, có cách nào để Proc B tra cứu được nó được gọi bởi A thay vì có tham số trong đó A vượt qua ID của nó không?Máy chủ SQL có thể lưu trữ proc xác định tên của cha mẹ mình không?

Theo yêu cầu: Lý do tôi quan tâm đến điều này là nhiều lần 1) Kiến thức chung, tôi chắc chắn nếu có thể thực hiện nó sẽ liên quan đến việc sử dụng thông minh một số bảng/biến hệ thống có thể giúp tôi những thứ khác trên đường.

2) Như những người khác đã đề cập, đăng nhập/kiểm tra. Tôi muốn thực hiện một thủ tục ghi lại một mục nhập bắt đầu, kết thúc và tin nhắn không yêu cầu tham số, và chấp nhận một tham số tùy chọn của một thông báo được chỉ định của người dùng. Điều này sẽ cho phép một người chỉ đơn giản là thả một exec ở phía trên và dưới của một proc để làm cho nó hoạt động và thủ tục kiểm toán sẽ tự tìm ra phần còn lại.

Tôi biết thông tin này có sẵn trong các tệp nhật ký, nhưng phân tích cú pháp và cung cấp cho người dùng không phải là tất cả, nhưng điều này sẽ cho phép dễ dàng truy cập vào thông tin cơ bản đó.

3) Sử dụng kết hợp với một semaphore một thủ tục tổng quát như vậy có thể đảm bảo rằng các quá trình có liên quan đều không được thực hiện đồng thời không phân biệt phiên/giao dịch, vv

Trả lời

0

Tại sao bạn sẽ muốn làm điều đó?
AFAIK, không có cách nào để proc B biết ai đã gọi nó.

EDIT: Vì KM cho thấy rằng có thể (theo mã), tôi quan tâm đến việc hiểu lý do đằng sau việc này. Bạn có thể đăng bài đó không, bằng cách thêm nó vào câu hỏi của bạn?

+0

Tôi đã thực hiện việc này trước đây để giúp ghi lại sự kiện. Trong các thủ tục quan trọng/có vấn đề, tôi tiếp tục chắp thêm một thông tin hữu ích vào varchar (8000) varibale vì thủ tục thực hiện nhiều thứ khác nhau. Khi có một lỗi, tôi rollback và chèn chuỗi này vào một bảng đăng nhập, trong đó có nhiều thông tin hữu ích trong nó. Đôi khi biết ai được gọi là thủ tục giúp và có thể được ghi lại với các thông tin khác ... –

+0

Tôi nghĩ vậy.Giống như StackTrace cho thủ tục được lưu trữ. Cảm ơn KM. – shahkalpesh

+0

Tôi không tổ chức các cuộc gọi thủ tục tất cả những gì sâu sắc. Tôi đã sử dụng kỹ thuật này để theo dõi một thủ tục được gọi từ nhiều địa điểm. Đó là một điều để biết bạn có thông số xấu, và một để biết nơi họ đang đến từ –

0

Nếu quy trình được lưu trữ cần phải hoạt động khác nhau dựa trên người gọi nó, thì cần phải thêm thông số. Bằng cách đó, nếu bạn thêm thủ tục lưu sẵn "Z", mã sẽ vẫn hoạt động - "Z" có thể chuyển tham số theo cách "C" đã truyền hoặc cách "D" truyền. Nếu điều đó không đủ tốt, thì logic mới cần được thêm vào "B".

1

không, nó không thể cho biết sproc gọi nó là gì. Bạn sẽ cần phải thêm một tham số thêm vào để cho nó ai là người gọi là

+2

Có thể có một số mã cực kỳ phức tạp mà bạn có thể viết để truy cập vào chế độ xem hệ thống, theo dõi và phân tích cú pháp qua ngăn xếp cuộc gọi ... nhưng tôi không biết thông tin đó có ở đó hay không. –

4

sử dụng một prarameter như thế này:

CREATE PROCEDURE ParentProcedure 

AS 

DECLARE @ProcID    int 

SET @[email protected]@PROCID 

EXEC ChildProcedure @ProcID 

RETURN 0 
go 

và điều này ...

CREATE PROCEDURE ChildProcedure 
(
@ProcID int=null --optional 
) 
AS 

if @ProcID IS NOT NULL 
BEGIN 
    PRINT 'called by '+OBJECT_NAME(@ProcID) 
END 

RETURN 0 
go 
0

Trong MSSQL Server 2008 bạn có thể sử dụng sys.dm_exec_procedures_stats, khung nhìn quản lý năng động này có thể hiển thị cho bạn khi thủ tục lưu sẵn (xem thêm sys.procedures để lấy tên của thủ tục) đã được thực hiện và cứ thế.

SELECT s.*, d.* 
FROM sys.procedures s 
INNER JOIN sys.dm_exec_procedure_stats d 
ON s.object_id = d.object_id 
ORDER BY [d.last_execution_time] DESC; 

Thủ tục chính sẽ được hiển thị trong tập hợp kết quả này rất gần, vì quy trình này sẽ được thực hiện trước đó. Tất nhiên, đây không phải là giải pháp hoàn chỉnh cho vấn đề của bạn, nhưng bạn có thể nhận được một số thông tin.

và có, nếu có đồng thời, giải pháp này không hoạt động. Nó có thể giúp phát triển hoặc gỡ lỗi chỉ.

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