Способ реагирования на удаление любой строки из таблицы в SQL Server 2005 - PullRequest
1 голос
/ 09 марта 2012

В нашей базе данных у нас много таблиц (конечно).В нашей базе данных есть одна таблица, скажем, файлы.В этой таблице есть список всех файлов, относящихся к каждой таблице, таких как люди, контакты и т. Д. Теперь в таблице файлов есть один столбец (родительская запись), в котором хранится ключ родительской записи (а не внешний ключ на уровне базы данных, поскольку это невозможно).столбец имеет отношение к нескольким таблицам) к людям или контактам.Теперь я хочу создать что-то на уровне базы данных в одном месте, чтобы увидеть, что мы удалили строки из людей, поэтому удалите все строки из контактов.

  1. Один способ создания триггера для каждой таблицы, но у нас есть сотни таблиц.
  2. Мы не можем использовать каскадное удаление, поскольку отношение не является внешним ключом.

Мы не можем изменить структуру таблицы, так как мы получили существующие данные.

Спасибо

1 Ответ

0 голосов
/ 09 июня 2012

Подход, предложенный '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...