Làm thế nào tôi có thể theo dõi các phụ thuộc cơ sở dữ liệu?


37

Khi các ứng dụng nội bộ phát triển trong một số năm, đôi khi bạn thấy có một số bảng mà mọi người tin rằng không còn phù hợp và muốn loại bỏ. Các phương pháp thực tế để xác định các phụ thuộc cơ sở dữ liệu, cả trong môi trường SQL và có thể trở thành những thứ như SSIS là gì?

Tôi đã từng làm việc ở những nơi đã có những lựa chọn khá tàn bạo như:

  • Thả trước, đặt câu hỏi sau (có thể giết bản dựng kho dữ liệu nếu nó cố trích xuất một bảng không còn tồn tại)
  • Trước tiên hãy xóa quyền và chờ báo cáo lỗi (có thể gây ra lỗi im lặng, nếu lỗi không được xử lý chính xác)

Tôi đánh giá cao rằng SQL Server đi kèm với các công cụ để theo dõi các phụ thuộc trong trường hợp đó, nhưng chúng có vẻ khó khăn nếu bạn có cơ sở dữ liệu trên các trường hợp khác nhau. Có các tùy chọn giúp truy vấn phụ thuộc dễ dàng hơn, có thể trả lời các câu hỏi như "Cột này được sử dụng ở đâu?" với các câu trả lời như "Kết thúc trên máy chủ khác trong quy trình được lưu trữ này" hoặc "Kết thúc trong gói SSIS này"?

Câu trả lời:


14

Không có cách dễ dàng để làm điều này. Kích hoạt không hoạt động, như thể bạn chọn từ một bảng không kích hoạt được kích hoạt. Cách tốt nhất mà tôi thấy để làm điều này là để các nhà phát triển theo dõi những gì họ sử dụng. Khi một cái gì đó sẽ được bỏ kiểm tra với tất cả các nhóm phát triển, và sau khi mọi người đăng nhập, đổi tên đối tượng. Sau đó, không có gì phá vỡ trong một tháng hoặc đến, đối tượng có thể được thả một cách an toàn.


7
  1. Mã tìm kiếm để sử dụng với sys.sql_modules.def định: nó có được tham chiếu không? Sau đó...
  2. Kiểm tra quyền: mã khách hàng nào có thể gọi nó? Sau đó...
  3. Hồ sơ

Như vậy:

  • Đối với một bảng không có tham chiếu và không có quyền, nó không được sử dụng.
  • Không có tài liệu tham khảo và một số quyền, hãy chạy profiler để xem cách sử dụng
  • Không có quyền và tài liệu tham khảo, thêm ghi nhật ký sử dụng

Những gì tôi đã làm trước đây là làm cho bảng một khung nhìn che khuất bảng sau đó làm cho khung nhìn hoạt động kém: (tham gia chéo chính nó, khác biệt). Bạn không thực sự xóa nó nhưng bạn tạo ra thời gian chờ hoặc khiếu nại của khách hàng ...


6

Một cách nhanh chóng mà tôi đã sử dụng trong quá khứ (và nó thực sự phụ thuộc vào kích thước của bảng, số hiệu suất chỉ mục, v.v.), là thêm một trình kích hoạt, ghi lại dấu thời gian khi một hành động được thực hiện trên bảng. Như tôi đã nói điều này có thể có vấn đề về hiệu suất, vì vậy cần phải thận trọng - cũng xem bảng ghi nhật ký của bạn không sử dụng các trường danh tính, vì điều này có thể làm hỏng một số mã cũ sử dụng @@ IDENTITY. Tất nhiên, đôi khi nó có thể chỉ ra rằng một tính năng trong một ứng dụng đã không được sử dụng.

Rất khó để theo dõi các phụ thuộc khi tất cả các mã có thể tấn công cơ sở dữ liệu không có trong cơ sở dữ liệu, tức là các máy khách ngẫu nhiên truy vấn cơ sở dữ liệu.

EDIT: Để giải quyết điểm mà bảng không thể có trình kích hoạt CHỌN, đây là một tùy chọn khác có thể hoạt động với giả định các bảng của bạn có chỉ mục (chỉ được thử nghiệm trong năm 2008).

SELECT          
    last_user_seek,
    last_user_scan,
    last_user_lookup,
    last_user_update
FROM
    sys.dm_db_index_usage_stats AS usage_stats
INNER JOIN
sys.tables AS tables ON tables.object_id = usage_stats.object_id
WHERE
    database_id = DB_ID() AND
    tables.name = 'mytable' 

nhưng lưu ý rằng bảng thống kê sử dụng sẽ bị xóa khi máy chủ được khởi động lại, tách ra, v.v. Vì vậy, bạn sẽ cần phải thiết lập một công việc để thu thập dữ liệu. Tôi biết một chút về hack.


4

Một cách mà tôi đã sử dụng trong quá khứ là thiết lập một danh sách các bảng ứng cử viên để loại bỏ và sau đó đổi tên chúng và tìm kiếm các thất bại.

Cách tôi thiết lập danh sách là:

  1. xem bảng nào không được sử dụng trong các thủ tục, trình kích hoạt và hàm được lưu trữ hiện tại

  2. bảng trống (không có hồ sơ);

  3. các bảng không được tham chiếu (các bảng không có bất kỳ mối quan hệ nào);

  4. xem bảng nào không được sử dụng kể từ khi Máy chủ DB được khởi động (DMV)

Sau khi xây dựng danh sách trong tệp văn bản, tôi đã tạo một tập lệnh bó để phân tích các tệp .cs của chúng tôi (chúng tôi chỉ có các dự án .net) từ thư mục kiểm soát phiên bản được ánh xạ cục bộ và xem các bảng đó có được sử dụng trong các tệp .cs không ( không nên xảy ra, nhưng này .. tôi đã có những bất ngờ). Nếu không, thì rõ ràng, nếu có, thì chúng tôi xây dựng một danh sách và đưa cho các nhà phát triển để kiểm tra xem mô-đun đó có còn được sử dụng không.

Vì vậy, trong ngắn hạn, những người trước đó là đúng, không có viên đạn bạc.


3

Chính sách tôi đang thực hiện tại công ty của mình là đặt mọi thứ chạm vào SQL Server dưới sự kiểm soát nguồn, ở một vị trí trung tâm.

  • dự án asp.net
  • Dự án SSRS
  • Dự án SSIS
  • Tôi thậm chí kịch bản ra tất cả các đối tượng cơ sở dữ liệu vào một kho lưu trữ các loại.

Tôi chưa thiết lập nó, nhưng cuối cùng tôi muốn triển khai một số loại cơ chế tìm kiếm chỉ mục / trung tâm mà tôi có thể sử dụng để tìm kiếm các bảng, sprocs cụ thể, v.v. Chúng tôi thực sự là một SQL Server Shop mới - chuyển đổi từ FoxPro . Vì vậy, các đối tượng SQL cũ chưa phải là vấn đề lớn, nhưng tôi đang lên kế hoạch cho tương lai.

Vấn đề tôi thấy với cách tiếp cận đổi tên / theo dõi là một số thứ chỉ chạy hàng năm, và thậm chí không phải mỗi năm. Không đề cập đến những điều đặc biệt khác nhau mà mọi người yêu cầu bạn viết, và sau đó yêu cầu một tháng nữa hoặc nhiều năm sau.


3

Có nhiều công cụ và kỹ thuật để sử dụng trong việc theo dõi các phụ thuộc, liên quan đến:

Công cụ tôi biết:

  • Trình xem phụ thuộc SQL Server (nhưng có thể có vấn đề nếu sp sử dụng bảng được tạo trước khi bảng được tạo)
  • Redgate Theo dõi phụ thuộc SQL (thông qua câu trả lời của @Eric Humphrey)
  • Chia sẻ lại (công cụ .net có thể được sử dụng để xem các đường dẫn gọi, tôi nghĩ rằng nó có thể được sử dụng để theo dõi nơi các cuộc gọi SQL chính được sử dụng)

Phương pháp

  • Mã tìm kiếm để sử dụng các đối tượng SQL (sao chép một số công cụ ở trên)
  • Nhìn vào số liệu thống kê sử dụng (nghĩa là: khi nào một đối tượng SQL được gọi lần cuối), tôi sử dụng SQL dưới đây:

    SELECT 
        last_execution_time,   
        (SELECT TOP 1 
            SUBSTRING(s2.text,statement_start_offset / 2+1 , 
                ((CASE WHEN statement_end_offset = -1 THEN 
                    (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
                ELSE statement_end_offset END) - statement_start_offset) / 2+1)
        )  AS sql_statement,
        execution_count
    FROM sys.dm_exec_query_stats AS s1 
    CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
    WHERE 
        s2.text like '%[OBJECT NAME]%' 
        and last_execution_time > [DATE YOU CARE ABOUT]
    ORDER BY last_execution_time desc

Lưu ý : Bảng thống kê sử dụng sẽ bị xóa khi máy chủ được khởi động lại, tách ra, v.v. Vì vậy, bạn sẽ cần phải thiết lập một công việc để thu thập dữ liệu. Tôi biết một chút về hack. (từ @Miles D)

Kỹ thuật

  • Tìm kiếm lần sử dụng cuối cùng (xem số liệu thống kê sử dụng ở trên)
  • Tìm kiếm nơi nó được sử dụng (xem công cụ)
  • Xem lại việc sử dụng mã với các nhà phát triển (thông qua @MrDenny)
  • Đổi tên đối tượng (ví dụ: bài đăng / tiền tố với _toBeDropping) và xem lỗi
  • Thay đổi quyền và theo dõi lỗi
  • Thả đồ vật và cầu nguyện

2

Vài năm trước, tôi đã cố gắng xây dựng một công cụ để kiểm tra những thứ tương tự. Câu trả lời TL; DR là tôi thấy không thể thực hiện được với các tài nguyên có sẵn tại thời điểm đó.

Cột này được sử dụng ở đâu?

Câu hỏi này trở nên phức tạp hơn khi bạn nhận ra rằng một số truy vấn, chế độ xem và quy trình được lưu trữ sử dụng select *từ bảng mà cột được lưu trú. Sau đó, bạn cần xem các chương trình sử dụng các kết quả đó - vì vậy bạn cần một số trình quét / bộ chỉ mục / trình phân tích cú pháp có khả năng đọc mã nguồn có thể là C #, Delphi, Java, VB, ASP (cổ điển), v.v. chỉ để cố gắng tìm kiếm mọi tham chiếu đến cột đó. Sau đó, bạn cần phân tích các chương trình đó để thử và xác định xem mã đó có còn được gọi nữa hay không.



2

Đây thực sự không phải là một câu trả lời cho câu hỏi của bạn, nhưng tôi nghĩ rằng nó có đề cập đến: đây là một lý do tại sao tất cả các hệ thống bên ngoài cơ sở dữ liệu của bạn nên giao tiếp qua chế độ xem và sprocs . Bạn có các tập lệnh xây dựng cho các tập lệnh này trong các tệp .sql có thể tìm kiếm, vì vậy bạn có thể dễ dàng xem liệu một bảng hoặc cột cụ thể đang được sử dụng bên ngoài.

Tất nhiên SSIS thường sẽ kết nối trực tiếp với các bảng, vì vậy điều này có thể không giúp ích nhiều cho nhu cầu của bạn ngay bây giờ. Nhưng khi các nhà phát triển kết nối với cơ sở dữ liệu của bạn và phàn nàn về việc phải đợi bạn (hoặc bất kỳ ai đang phục vụ như DBA) để thực hiện các chế độ xem và sprocs họ cần, bạn có thể nói với họ: "Bất kỳ bảng hoặc cột nào cũng có thể bị xóa hoặc đổi tên. Tôi ' m chỉ bắt buộc phải thông báo cho bạn về những thay đổi về quan điểm và sprocs. " Và họ chỉ phải thực hiện kiểm tra hồi quy cho những thay đổi cụ thể này.


0

TSQL sau đây có thể được sử dụng sys.dm_sql_Vferences_entities hoặc sys.sql_expression_dependencies

Ngoài ra, các công cụ như SQL đàm phán Pro, Redgate, v.v. có thể tạo trực quan này cho bạn bằng GUI

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.