Phiên bản SQL Server - 2008 R2Nhận cơ sở dữ liệu SQL Server Cross Phụ thuộc
Tôi đang làm việc để đánh giá giải pháp DMS, với mục tiêu tiếp quản bảo trì. Giải pháp ban đầu có một cơ sở dữ liệu trung tâm, có dữ liệu liên quan đến nhà sản xuất. Nó cũng có một cơ sở dữ liệu cho mỗi đại lý, có nghĩa là có rất nhiều phụ thuộc cơ sở dữ liệu chéo.
Những vấn đề:
- Không DB tài liệu
- Không có mã bình luận
- Rất nhiều đống
- Không có đối tượng tiêu chuẩn quy ước đặt tên
- Các trung tâm DB có 460+ bảng và 900 + SPROCS , ngoài các đối tượng khác
- Mỗi đại lý DB có 370+ bảng và 2350+ SProcs, trong tiện ích bổ sung n đến các đối tượng khác
Bước đầu tiên, tôi đề xuất làm sạch hoàn toàn phụ thuộc vào đối tượng, bao gồm phụ thuộc cơ sở dữ liệu chéo. Tôi đã thử sử dụng giải pháp của Red Gate, nhưng đầu ra là quá lớn. Tất cả những gì tôi muốn là một danh sách các đối tượng trong cơ sở dữ liệu không có bất kỳ sự phụ thuộc nào - chúng không phụ thuộc vào các đối tượng khác, cũng như không có bất kỳ đối tượng nào phụ thuộc vào chúng.
Đây là kịch bản tôi đã sử dụng để có được một danh sách phụ thuộc:
SELECT
DB_NAME() referencing_database_name,
OBJECT_NAME (referencing_id) referencing_entity_name,
ISNULL(referenced_schema_name,'dbo') referenced_schema_name,
referenced_entity_name,
ao.type_desc referenced_entity_type,
ISNULL(referenced_database_name,DB_NAME()) referenced_database_name
FROM sys.sql_expression_dependencies sed
JOIN sys.all_objects ao
ON sed.referenced_entity_name = ao.name
tôi sẽ tạo ra một bảng - Dependencies - vào mà tôi sẽ được chèn kết quả này thiết lập từ mỗi DB. Bước tiếp theo, tôi cũng sẽ tạo một bảng khác - AllObjects - sẽ chứa danh sách tất cả các đối tượng trong Cơ sở dữ liệu. Đây là kịch bản để làm điều này:
SELECT
DB_NAME() DBName,
name,
type_desc
FROM sys.all_objects
WHERE type_desc IN
(
'VIEW',
'SQL_TABLE_VALUED_FUNCTION',
'SQL_STORED_PROCEDURE',
'SQL_INLINE_TABLE_VALUED_FUNCTION',
'USER_TABLE',
'SQL_SCALAR_FUNCTION'
)
Bây giờ, một danh sách các tên từ bảng này, không xuất hiện trong cột referenced_entity_name trong bảng phụ thuộc nên đưa ra một danh sách các đối tượng mà tôi đang tìm kiếm.
SELECT
AO.DBName,
AO.name,
AO.type_desc
FROM AllObjects AO
LEFT OUTER JOIN Dependencies D ON
D.referenced_database_name = AO.DBName AND
D.referenced_entity_name = AO.name AND
D.referenced_entity_type = AO.type_desc
WHERE
D.referenced_database_name IS NULL AND
D.referenced_entity_name IS NULL AND
D.referenced_entity_type IS NULL
Bây giờ các câu hỏi:
- Một số đối tượng phụ thuộc dường như mất tích trong đầu ra. Tôi thiếu là gì?
- Làm cách nào để xác thực rằng phát hiện của tôi là chính xác?
- Ý tôi là có cách khác để thực hiện việc này, vì vậy tôi có thể so sánh kết quả và kiểm tra kỹ?
Cảm ơn trước,
Raj
Bạn cũng quan tâm đến các đối tượng SYSTEM? –
Nhưng loại = 'U' sẽ chỉ cung cấp cho người dùng bảng, phải không? Tôi cũng cần xem xét các đối tượng được tạo khác. – Raj
Rất tiếc, "và is_ms_shipped = 0" có thể phù hợp hơn cho truy vấn thứ 2. Điều này sẽ loại trừ các đối tượng cụ thể của hệ thống. –