J'ai environ 50 tables créées par et changées en référençant la table utilisateur. Quand je veux supprimer l'utilisateur, je voudrais créer une liste de quelles tables cet utilisateur a des données, ainsi on peut aller supprimer/éditer tout ce qui appartient à cet utilisateur. Y a-t-il un moyen de le faire en SQL?Rechercher les clés étrangères utilisées
Répondre
Pas exactement sûr de ce que vous allez pour ici ..
Si vous voulez une liste de clés étrangères faisant référence à une table essayer cette question How can I list all foreign keys referencing a given table in SQL Server?
C'est à peu près ce que je veux, sauf que j'ai besoin de faire une boucle après cette requête pour vérifier quelles tables/fk contient réellement des données pour un utilisateur donné. Je suppose que la façon la plus simple de le faire est d'utiliser .net pour faire une boucle dans le jeu de résultats et générer une requête pour chacun. – devzero
Un couple de méthodes pour trouver les tables qui référencent votre table utilisateur à travers des relations de clés étrangères ont été publiées et en voici une autre: http://www.sqlservercurry.com/2009/03/simple-stored-procedure-to-find-foreign.html
Une fois que vous obtenez la liste des tables, vous allez devoir écrire le SQL pour déterminer quelles tables ont des enregistrements pour un utilisateur spécifique. Il n'y a pas moyen de contourner cela. Les requêtes semblant toutes identiques, vous pouvez coller la liste des tables dans Excel, utiliser une formule pour générer les requêtes, puis coller les requêtes dans SSMS.
ce listera toutes les tables où votre ID existe:
DECLARE @Query varchar(1000)
DECLARE @MaxRow int
DECLARE @CurrentRow int
DECLARE @CurrentTable varchar(500)
DECLARE @UserID int
SET @UserID=???
CREATE TABLE #Rows
(
RowID int not null primary key identity(1,1)
,TableWithForeignKey varchar(500)
)
CREATE TABLE #Temp
(
RowValue int
)
INSERT INTO #Rows
(TableWithForeignKey)
select
t.name as TableWithForeignKey --, fk.constraint_column_id as FK_PartNo , c.name as ForeignKeyColumn
from sys.foreign_key_columns as fk
inner join sys.tables as t on fk.parent_object_id = t.object_id
inner join sys.columns as c on fk.parent_object_id = c.object_id and fk.parent_column_id = c.column_id
where fk.referenced_object_id = (select object_id from sys.tables where name = '????????')
--order by TableWithForeignKey, FK_PartNo
SELECT @[email protected]@ROWCOUNT
SET @CurrentRow=0
SELECT * FROM #Rows
WHILE @CurrentRow<@MaxRow
BEGIN
SET @[email protected]+1
SELECT @CurrentTable=TableWithForeignKey FROM #Rows WHERE [email protected]
--SET @Query='DELETE FROM '[email protected]+' WHERE UserID='+CONVERT(varchar(20),@UserID)
SET @Query='SELECT COUNT(*) FROM '[email protected]+' WHERE YourIDhere='+CONVERT(varchar(20),@UserID)
PRINT @Query
INSERT INTO #Temp
EXECUTE (@Query)
IF NOT EXISTS (SELECT RowValue FROM #Temp WHERE RowValue>0)
BEGIN
PRINT 'no matches found'
DELETE #Rows WHERE [email protected]
END
ELSE
BEGIN
PRINT 'matches found!!'
END
DELETE #Temp
END
--list all tables where the ID exists
SELECT * FROM #Rows
Ceci est essentiely correct, mais vous devez mettre [] noms de table, et YourIDhere devrait être dynamique. – devzero
SQL 2005+ fournit un certain nombre de vues système comme sys.tables et sys.foreign_key_columns qui peuvent vous aider.
SELECT
pt.name AS ParentTable,
pc.name AS ParentColumn,
rt.name AS ReferencedTable,
rc.name AS ReferencedColumn
FROM sys.foreign_key_columns fkc
INNER JOIN sys.tables pt ON pt.object_id = fkc.parent_object_id
INNER JOIN sys.columns pc ON pc.column_id = fkc.parent_column_id AND
pc.object_id = fkc.parent_object_id
INNER JOIN sys.tables rt ON rt.object_id = fkc.referenced_object_id
INNER JOIN sys.columns rc ON rc.column_id = fkc.referenced_column_id AND
rc.object_id = fkc.referenced_object_id
- 1. Plusieurs clés étrangères?
- 2. Indexation des clés étrangères
- 3. XSD DataSets et ignorer les clés étrangères
- 4. ASP.NET MVC DropDownLists et les clés étrangères
- 5. Rails fixtures - comment définir les clés étrangères?
- 6. Supprimer les clés étrangères dans sybase 12,5
- 7. Clés étrangères rompues dans Rails
- 8. Cadre d'entité et clés étrangères
- 9. Clés étrangères croisées dans SQL
- 10. Clés étrangères d'entité dans GridViews
- 11. Comment rechercher des clés étrangères qui ne correspondent pas à leurs contraintes?
- 12. Deux clés étrangères avec ActiveRecord? [rails]
- 13. PostgreSQL, les clés étrangères, la vitesse d'insertion et le Django
- 14. contraintes clés étrangères alors que les données de dumping
- 15. Mysql: supprimer par programme toutes les clés étrangères
- 16. Tables supplémentaires ou clés étrangères non spécifiques?
- 17. MySQL Retrait de certaines clés étrangères
- 18. Comment rechercher une valeur spécifique dans les clés de registre
- 19. Pourquoi django est-il lent à générer des boîtes de sélection pour les clés étrangères?
- 20. C# MySqlCommand Problème de clés étrangères multiples Drop
- 21. Liaison de données WinForms et relations de clés étrangères
- 22. Modèle django avec deux clés étrangères génériques (content_type)?
- 23. SQL Server 2000 - requête relations clés étrangères d'une table
- 24. Introspect postgresql 8.3 pour trouver des clés étrangères
- 25. NHibernate mappage avec des chaînes, pas de véritables clés étrangères
- 26. SQL Server 2005 - Clés étrangères avec suppression en cascade
- 27. Comment accéder aux clés étrangères dans le modèle d'entité ADO.NET?
- 28. SubSonic ne génère pas de tables de clés étrangères MySql
- 29. Cartographie une collection de clés étrangères dans NHibernate
- 30. Référencement de clés étrangères dans la même colonne
consultez ma réponse, il fait ce que vous avez besoin –