Je construis un script PHP à usage personnel en utilisant le pilote MSSQL
dans PDO (en tant que tel il n'y a pas de plan pour laisser quiconque d'autre que moi utiliser cela) qui, lorsqu'il est fourni avec un nom de table returnnera tous les objects qui le referencent
en utilisant MySVR.MyDB.dbo.Staff
comme ma table je commence d'abord avec cette requête
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
qui list tous les objects sur MyDB
qui referencent ma Table de Personnel
Je sais que ma table Staff
est utilisée sur une autre database dans une procédure stockée, MySVR.MySecDB.dbo.spMyDB_Staff
. Pour le confirmer, je modifie la string de connection PDO et réexécute la requête mais avec referenced_database_name = 'MyDB'
pour m'assurer que seuls les résultats qui referencent MySVR.MyDB.dbo.Staff
et non MySVR.MySecDB.dbo.Staff
.
Le problème est cependant de savoir comment détecter si Staff
est référencé dans MySecDB
ou toute autre database en dehors de MyDB
pour que je puisse l'utiliser? De même, comment puis-je détecter si ma table est référencée sur un autre server comme dans MyOtherSVR.anotherDBDB.dbo.spMySVR_MyDB_Staff
?
J'ai pensé à exécuter la requête sur chaque server et database (en modifiant la string de connection PDO dans une boucle) et en vérifiant si j'ai obtenu des résultats mais cela me semble excessif.
Alors est-il un moyen de dire si une table est référencée dans une autre database / server?
Les references dans d'autres bases de données sur la même instance SQL sont assez faciles à find: vous pouvez exécuter une requête similaire à celle que vous avez publiée sur chacune des autres bases de données de l'instance, en supposant que vous disposez des permissions suffisantes dans toutes les bases de données.
Si vous n'avez pas access à toutes les bases de données sur votre même instance, vous êtes bloqué.
Au-delà de cela, c'est impossible au mieux et impossible au pire d'identifier des references sur d'autres servers. Cela ne serait possible que si vous connaissiez et si vous étiez un administrateur de tous les servers qui pourraient referencer cette database.