2017-05-04 57 views
3

我建立使用PDO的MSSQL驅動程序(因爲這樣的事,沒有計劃讓別人,但我使用)一個個人使用 PHP腳本時提供一個表名稱將返回引用的所有對象有沒有辦法判斷表是否在另一個數據庫/服務器中被引用?

使用MySVR.MyDB.dbo.Staff作爲我的表我第一次開始與這個查詢

SELECT 
    referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID), 
    referencing_object_name = o.name, 
    referencing_object_type_desc = o.type_desc, 
    referenced_schema_name, 
    referenced_object_name = referenced_entity_name, 
    referenced_object_type_desc = o1.type_desc, 
    referenced_server_name, referenced_database_name  
FROM 
    sys.sql_expression_dependencies sed 
INNER JOIN 
    sys.objects o ON sed.referencing_id = o.[object_id] 
LEFT OUTER JOIN 
    sys.objects o1 ON sed.referenced_id = o1.[object_id] 
WHERE 
    referenced_entity_name = 'Staff' 
    AND referenced_server_name IS NULL 
    AND referenced_database_name IS NULL 
ORDER BY 
    o.name 

其中列出了MyDB其引用我的工作人員表中的所有對象

我知道我的Staff表用於存儲過程中的另一個數據庫,MySVR.MySecDB.dbo.spMyDB_Staff。爲了確認,我改變PDO連接字符串,然後重新運行查詢,但與referenced_database_name = 'MyDB',以確保我只得到引用MySVR.MyDB.dbo.Staff而不是MySVR.MySecDB.dbo.Staff結果。然而

的問題是我如何檢測是否StaffMySecDB被引用或外部MyDB任何其他數據庫我使用這樣做呢?同樣,如果我的表正在MyOtherSVR.anotherDBDB.dbo.spMySVR_MyDB_Staff之類的另一臺服務器上引用,我該如何檢測?

我沒想到運行的每一個服務器和數據庫(改變在一個循環中PDO連接字符串)查詢和檢查,如果我得到任何結果,但似乎過度給我。

那麼,有沒有辦法判斷一個表在另一個數據庫/服務器被引用?

+0

如果你有一個世界上所有服務器和所有數據庫的列表(或至少*你的*世界),那麼是的。腳本所有的SQL並解析它的對象引用。否則,這有點像問我是否可以找出中國的人是否有我的電話號碼。在他們打電話給我之前,我只是不知道,因爲要求中國的每個人都是不切實際的。這就是爲什麼應該小心處理鏈接服務器(以及一般的跨數據庫訪問)的原因。 –

回答

0

引用在同一SQL實例的其他數據庫是有些容易找到 - 你可以運行類似的查詢您發佈針對每個實例上的其他數據庫的一個,假設你在所有數據庫中得到了充分的權限。

如果您沒有訪問所有數據庫上的同一個實例,那麼你就完蛋了。

除此之外,這是不現實的,充其量&不可能在最壞的情況,以確定其他服務器上的引用。這隻有在你知道並且是可能引用該數據庫的所有服務器的管理員時纔可能。

相關問題