2009-04-06 2 views
2

У меня около 50 таблиц с созданной и измененной ссылкой на пользовательскую таблицу. Когда я хочу удалить пользователя, я хотел бы создать список таблиц, в которых этот пользователь имеет данные, поэтому можно удалить/изменить все принадлежащее указанному пользователю. Есть ли способ сделать это в SQL?Найти, что используются внешние ключи

+0

проверить мой ответ, он делает то, что вам нужно –

ответ

3

Не совсем уверен, что вы собираетесь здесь ..

Если вы хотите получить список внешних ключей, ссылающихся стол попробовать этот вопрос How can I list all foreign keys referencing a given table in SQL Server?

+0

Это в значительной степени то, что я хочу, за исключением того, что мне нужно сделать цикл после этого запроса, чтобы проверить, какие таблицы/fk фактически содержат данные для данного пользователя. Я думаю, что самый простой способ сделать это - использовать .net для прокрутки набора результатов и генерации запроса для каждого. – devzero

3

Вы можете использовать каскадное удаление.

+0

Как это «создать список таблиц»? – Tomalak

+0

Нет, он не будет создавать список, он просто * DO *, что вы хотели сделать в первую очередь: D – inspite

+0

Что делать, если я хотел создать список? :-D – Tomalak

0

Несколько методов для поиска таблиц, которые ссылаются на вашу таблицу пользователя через отношения с внешним ключом, были опубликованы, а вот здесь: http://www.sqlservercurry.com/2009/03/simple-stored-procedure-to-find-foreign.html

Как только вы получите список таблиц, вам нужно будет написать SQL, чтобы определить, какие таблицы имеют записи для определенного пользователя. Это не так. Поскольку запросы будут выглядеть одинаково, вы можете вставить список таблиц в Excel, использовать формулу для построения запросов, а затем вставить запросы обратно в SSMS.

1

это список всех таблиц, где ваш ID существует:

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

Это очень важно, но вам нужно поместить [] имена таблиц, а YourIDhere должен быть динамическим. – devzero

2

SQL 2005+ обеспечивает ряд системных представлений, как sys.tables и sys.foreign_key_columns, которые могут помочь вам.

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