Подход, предложенный 'pst', по сути является подходом для сборки мусора, и он может быть предпочтительнее использования триггеров.Не зная общих характеристик системы, если отзывчивость более важна, этот подход не добавит времени к удалению данной записи.Иными словами, риск наличия ресурсов, на которые нет ссылок, меньше, чем риск замедления шага удаления.
В этом примере кода будут циклически проходить таблицы с удостоверениями и удаляться все сироты этой таблицы в централизованной таблице «ресурсов»..
Допущения:
- Каждая из родительских таблиц имеет столбец идентификаторов
- Таблица «Ресурсы» таблицы ресурсов каким-то образом идентифицирует таблицу, для которой можно найти своего родителя.(в этом примере в качестве примера используется столбец «TableName»)
(Опубликовано в Центре сценариев Microsoft) http://gallery.technet.microsoft.com/scriptcenter/Garbage-Collection-of-a-99594c13
DECLARE @ResourceTableName sysname
SET @ResourceTableName = 'Resource'
--cursor variables
DECLARE @sql nvarchar(max)
DECLARE @primarySchema sysname
DECLARE @primaryTableName sysname
DECLARE @identityColumnName sysname
DECLARE curTableName CURSOR LOCAL FAST_FORWARD READ_ONLY FOR
SELECT table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
AND table_name <> @ResourceTableName
-- loop through tables
OPEN curTableName
FETCH NEXT FROM curTableName
INTO @primarySchema, @primaryTableName, @identityColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = '
DELETE --SELECT *
FROM ' + @ResourceTableName + '
WHERE TableName = ''' + @primaryTableName + '''
AND ParentID NOT IN (
SELECT ' + @identityColumnName + ' FROM ' + @primarySchema + '.' + @primaryTableName + '
)'
--PRINT @sql
EXEC sp_ExecuteSQL @sql
FETCH NEXT FROM curTableName
INTO @primarySchema, @primaryTableName, @identityColumnName
END
-- close a cursor
CLOSE curTableName
DEALLOCATE curTableName