Làm cách nào để biết quy trình được lưu trữ hoặc trình kích hoạt nào đang sử dụng bảng trên SQL Server 2008 R2?


9

Đây là trường hợp trong DB tôi đang kiểm tra, có một bảng lưu trữ lưu giữ lịch sử người dùng và có một quy trình kích hoạt hoặc lưu trữ mà sau một thời gian xóa các hàng khỏi bảng này, để tránh quá khổ của tương tự, tôi không thiết kế DB, tôi chỉ bảo trì một ứng dụng sử dụng DB này, vì vậy tôi không biết tên của các thủ tục hoặc trình kích hoạt được lưu trữ này, điều tôi muốn làm là xác định vị trí thủ tục được lưu trữ này hoặc kích hoạt, kiểm tra mã và sửa đổi nó để "lịch sử người dùng" này lâu hơn trên bàn.

Ai đó bảo tôi kiểm tra bảng "sysobjects", nơi tôi thực sự có thể thấy thứ gì đó có cùng tên của bảng, nhưng đây là thông tin duy nhất tôi có thể truy xuất, có lời khuyên nào không?

Cảm ơn bạn.

Câu trả lời:


6

Tìm kiếm tất cả mã bằng sys.sql_modules

SELECT OBJECT_NAME(object_id)
FROM sys.sql_modules sm
WHERE definition LIKE '%Mytable%'

Hoặc sử dụng Red Gate SQL Search hoàn toàn miễn phí

Không sử dụng syscomments hoặc Information_SCHema.RUBBISH


Không phải đồng nghiệp cũng nhấp chuột phải vào bảng mục tiêu và nhấn "Hiển thị phụ thuộc" (hoặc một số văn bản cho hiệu ứng đó)?
Nick Chammas

@Nick Chammas: không, điều này nổi tiếng là không đáng tin cậy
gbn

@gbn, tôi hiểu rằng syscomments dành cho khả năng tương thích ngược và có thể bị xóa khỏi bản phát hành trong tương lai, nhưng bạn có thể giải thích lý do tại sao không sử dụng THÔNG TIN_SCHema không? thx
datagod

@datagod: giống nhau tại sao syscomments luôn là một lựa chọn kém: cột định nghĩa là nvarchar (4000). Điều này có nghĩa là bạn có thể bỏ lỡ một tham chiếu bảng nếu ở vị trí chuỗi> 4000 hoặc kéo dài ranh giới giữa các hàng nvarchar (4000) (tùy thuộc vào cách bạn xử lý nó, tôi có thể giả sử nếu bạn thực sự muốn ...
gbn 16/11/11

@gbn Trên thực tế syscommentscó nhiều hàng cho một đối tượng vượt quá giới hạn 4000 ký tự, làm cho các truy vấn sử dụng nó có giá trị như sys.sql_modules. Tôi vẫn đề nghị sys.sql_modulestuy nhiên kể từ khi syscommentsđược khấu hao.
Kenneth Fisher

4

Hãy dùng thử Tìm kiếm ApexSQL

ApexSQL Search là một bổ trợ SQL Server Management Studio và Visual Studio MIỄN PHÍ, trong số các tính năng khác, có tính năng Xem phụ thuộc. Tính năng View Dependencies có khả năng trực quan hóa tất cả các mối quan hệ của các đối tượng cơ sở dữ liệu SQL, bao gồm các mối quan hệ giữa các đối tượng được mã hóa và hệ thống, các đối tượng cụ thể của máy chủ SQL 2012 và các đối tượng được lưu trữ trong cơ sở dữ liệu được mã hóa bằng Mã hóa dữ liệu trong suốt (TDE)

Tính năng View Dependencies cũng cho phép bạn thiết lập và tùy chỉnh bố cục sơ đồ phụ thuộc trực quan, bao gồm các mối quan hệ sẽ được trình bày, bố cục và kích thước của sơ đồ được tạo và độ sâu đi sâu của các phụ thuộc

Tuyên bố miễn trừ trách nhiệm: Tôi làm việc cho ApexSQL với tư cách là Kỹ sư hỗ trợ


2

Để tham khảo trong tương lai kể từ năm 2008, cũng có một DMV có thể được sử dụng. sys.dm_sql_referencing_entities. Tôi thường thích nó hơn khi sử dụng SQL_Modules vì ​​nó tránh được các lỗi tích cực trong số những thứ khác. Tôi đã thảo luận về nó ở đây nhưng về cơ bản nếu bạn có một đoạn mã như thế này:

SELECT OBJECT_SCHEMA_NAME(object_id), OBJECT_NAME(object_id) 
FROM sys.sql_modules WHERE [definition] LIKE '%ABC%'

Bạn sẽ kết thúc với kết quả cho bảng ABC, bảng ABCLog xem vw_ABC, thủ tục được lưu trữ sp_Update_ABC, v.v. Ngoài ra, theo hiểu biết của tôi, DMV sẽ xử lý các SP được mã hóa cũng như không được mã hóa trong khi phương thức sql_modules chỉ hoạt động với các SP không được mã hóa .

Phiên bản DMV của cùng một truy vấn là thế này:

SELECT * FROM sys.dm_sql_referencing_entities('dbo.ABC', 'OBJECT')

1

Ngoài ra, bạn có thể sử dụng chế độ xem danh mục sys.sql_expression_dependencies . Sử dụng truy vấn này:

SELECT 
referencing_object_name = obj.name, 
referencing_object_type_desc = obj.type_desc, 
referenced_object_name = referenced_entity_name
FROM sys.sql_expression_dependencies sd 
INNER JOIN sys.objects obj 
ON sd.referencing_id = obj.[object_id] 
WHERE referenced_entity_name = 'MyTable'
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.