2010-05-17 92 views
1

在MS SQL 2005中,是否有可能找出哪些表/列正被用作另一個表中的鍵,或作爲存儲過程的一部分?如何查找數據庫表的所有依賴關係?

原因是我試圖清理一些舊的存儲特效和表,其中一些可以刪除,其中一些可以修剪列。但顯然我不想刪除正在使用的東西。

回答

1
DECLARE @BaseObject varchar(100) 
SET @BaseObject = 'AddEntry' 

SET NOCOUNT ON 

DECLARE @Objects TABLE (
    id int 
) 

INSERT @Objects (id) 
SELECT id FROM sysobjects 
WHERE name like @BaseObject 

WHILE (@@ROWCOUNT > 0) 
BEGIN 
    INSERT @Objects (id) 
    SELECT d.depid 
    FROM sysdepends d 
    WHERE d.id IN (SELECT id FROM @Objects) 
    AND d.depid NOT IN (SELECT id FROM @Objects) 
END 

SET NOCOUNT OFF 

SELECT convert(varchar(100), 
     '[' + oo.name + '].[' + o.name + ']') AS '--Object--' 
FROM sysobjects o 
INNER JOIN sysusers oo ON o.uid = oo.uid 
WHERE o.id IN (SELECT id FROM @Objects) 
ORDER BY oo.name, o.name 
+0

剛剛嘗試過,非常有用。 – Carlos 2010-05-18 07:35:00

1

在SQL Server 2008中有介紹,以保持對象依賴性跟蹤兩個新動態管理功能:sys.dm_sql_referenced_entitiessys.dm_sql_referencing_entities

1 /返回引用給定實體的實體:

SELECT 
     referencing_schema_name, referencing_entity_name, 
     referencing_class_desc, is_caller_dependent 
FROM sys.dm_sql_referencing_entities ('<TableName>', 'OBJECT') 

2 /對象引用的返回實體:

SELECT 
     referenced_schema_name, referenced_entity_name, referenced_minor_name, 
     referenced_class_desc, is_caller_dependent, is_ambiguous 
FROM sys.dm_sql_referenced_entities ('<StoredProcedureName>', 'OBJECT'); 

另一種選擇是使用Red Gate的一個非常有用的工具,稱爲SQL Dependency Tracker