У меня около 50 таблиц с созданной и измененной ссылкой на пользовательскую таблицу. Когда я хочу удалить пользователя, я хотел бы создать список таблиц, в которых этот пользователь имеет данные, поэтому можно удалить/изменить все принадлежащее указанному пользователю. Есть ли способ сделать это в SQL?Найти, что используются внешние ключи
ответ
Не совсем уверен, что вы собираетесь здесь ..
Если вы хотите получить список внешних ключей, ссылающихся стол попробовать этот вопрос How can I list all foreign keys referencing a given table in SQL Server?
Это в значительной степени то, что я хочу, за исключением того, что мне нужно сделать цикл после этого запроса, чтобы проверить, какие таблицы/fk фактически содержат данные для данного пользователя. Я думаю, что самый простой способ сделать это - использовать .net для прокрутки набора результатов и генерации запроса для каждого. – devzero
Несколько методов для поиска таблиц, которые ссылаются на вашу таблицу пользователя через отношения с внешним ключом, были опубликованы, а вот здесь: http://www.sqlservercurry.com/2009/03/simple-stored-procedure-to-find-foreign.html
Как только вы получите список таблиц, вам нужно будет написать 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 @[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
Это очень важно, но вам нужно поместить [] имена таблиц, а YourIDhere должен быть динамическим. – devzero
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
проверить мой ответ, он делает то, что вам нужно –