2009-04-06 8 views
2

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

+0

consultez ma réponse, il fait ce que vous avez besoin –

Répondre

3

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?

+0

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

3

Vous pouvez utiliser la suppression en cascade.

+0

Comment cela "créer une liste de tables"? – Tomalak

+0

Non, il ne créera pas une liste, il fera juste * DO * ce que vous vouliez faire en premier lieu: D – inspite

+0

Et si je voulais créer une liste? : -D – Tomalak

0

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.

1

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 
+0

Ceci est essentiely correct, mais vous devez mettre [] noms de table, et YourIDhere devrait être dynamique. – devzero

2

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 
Questions connexes