Sql 查找正在使用的外键

Sql 查找正在使用的外键,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有大约50个表,它们是通过引用用户表创建和更改的。当我想删除该用户时,我想创建一个该用户在哪些表中有数据的列表,这样就可以删除/编辑属于该用户的所有内容。在SQL中有什么方法可以做到这一点吗?您可以使用级联删除。您是否尝试过这个方法?不太确定您在这里要做什么 如果需要引用表的外键列表,请尝试以下问题 发布了几种通过外键关系查找引用用户表的表的方法,下面是另一种方法: 一旦获得表列表,就必须编写SQL来确定哪些表具有特定用户的记录。这是没有办法的。由于查询看起来都一样,您可以将表列表粘贴到Exc

我有大约50个表,它们是通过引用用户表创建和更改的。当我想删除该用户时,我想创建一个该用户在哪些表中有数据的列表,这样就可以删除/编辑属于该用户的所有内容。在SQL中有什么方法可以做到这一点吗?

您可以使用级联删除。

您是否尝试过这个方法?

不太确定您在这里要做什么

如果需要引用表的外键列表,请尝试以下问题

发布了几种通过外键关系查找引用用户表的表的方法,下面是另一种方法:


一旦获得表列表,就必须编写SQL来确定哪些表具有特定用户的记录。这是没有办法的。由于查询看起来都一样,您可以将表列表粘贴到Excel中,使用公式生成查询,然后将查询粘贴回SSMS。

这将列出您的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 @MaxRow=@@ROWCOUNT
SET @CurrentRow=0
SELECT * FROM #Rows
WHILE @CurrentRow<@MaxRow
BEGIN
    SET @CurrentRow=@CurrentRow+1
    SELECT @CurrentTable=TableWithForeignKey FROM #Rows WHERE RowID=@CurrentRow
    --SET @Query='DELETE FROM '+@CurrentTable+' WHERE UserID='+CONVERT(varchar(20),@UserID)
    SET @Query='SELECT COUNT(*) FROM '+@CurrentTable+' 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 RowID=@CurrentRow
    END
    ELSE
    BEGIN
        PRINT 'matches found!!'
    END

    DELETE #Temp
END
--list all tables where the ID exists
SELECT * FROM #Rows

SQL 2005+提供了许多系统视图,如sys.tables和sys.foreign\u key\u列,它们可能对您有所帮助

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

这是如何创建一个表列表的?不,它不会创建一个列表,它只会执行您首先要执行的操作:dw如果我要创建一个列表,该怎么办-数据这将不起作用,因为我想要的是创建一个列表,以便用户可以确定删除数据或将其移动到另一个用户的天气,或者简单地将用户标记为非活动,而不是删除它。在我的应用程序中执行级联删除甚至设置null都是非常糟糕的。这正是我想要的,只是我需要在这个查询之后执行一个循环,以检查哪些表/fk实际包含给定用户的数据。我想最简单的方法是使用.net循环遍历结果集,并为每个结果集生成一个查询。这基本上是正确的,但您需要输入[]表名,并且您的ID应该是动态的。请查看我的答案它可以满足您的需要