Как эффективно предотвратить обновление всех столбцов, кроме одного, в триггере? - PullRequest
2 голосов
/ 24 ноября 2011

У меня есть таблица с 250 столбцами, для которой я должен написать триггер, который будет препятствовать обновлению всех столбцов, кроме одного.

Существует столбец evt_updatable, который можно обновлять. Задача триггера - вызвать ошибку, когда пользователь пытается обновить что-либо, кроме этого столбца.

каковы разные способы достижения этого. один прямой способ - объявить 500 переменных, в которых хранятся вставленные и удаленные значения. как показано в фрагменте кода ниже.

SELECT         @newColdata1              = i.col1
               @oldColdata1              = d.col1
               @newColdata2              = i.col2
               @oldColdata2              = d.col1
                  ----------------------------
                ------------------------------ -- same thing for remaining 250 rows
     FROM      inserted i, deleted d
     WHERE     i.evt_code = d.evt_code;

Чем сравнивать их все на предмет изменений и выдавать ошибку, если что-то меняется. Есть ли другой лучший способ сделать это. так как требуется 500 различных объявлений переменных и еще много сравнений. пожалуйста, помогите мне в этом отношении

Просто: в моей таблице пользователь должен иметь возможность изменять только один конкретный столбец, если он пытается изменить что-то еще, триггер должен вызвать ошибку.

1 Ответ

3 голосов
/ 24 ноября 2011

Это хорошее использование для функции COLUMNS_UPDATED () , которая доступна в триггере.

Если обновлен только четвертый столбец, то возвращаемый битовый массив будет выглядеть примерно так:

00001000 00000000 00000000 00000000 ... (binary)

т.е. первый байт имеет значение 8, а остальные равны нулю; если обновляется любой другой столбец, то либо первый байт будет не равен 8, либо один из остальных не будет равен 0.

Функция возвращает varbinary, один бит для каждого столбца. Для 250 столбцов он вернет 32 байта данных (250/8), это означает, что вам нужно будет протестировать каждый байт, т.е.

IF (    (SUBSTRING(COLUMNS_UPDATED(), 1,1) = 8) 
    AND (SUBSTRING(COLUMNS_UPDATED(), 2,1) = 0) 
    AND (SUBSTRING(COLUMNS_UPDATED(), 3,1) = 0) 
    .
    .
    .
    AND (SUBSTRING(COLUMNS_UPDATED(),31,1) = 0) 
    AND (SUBSTRING(COLUMNS_UPDATED(),32,1) = 0) 
) 

Это проверяет, что ровно один конкретный столбец был обновлен. Если у вас есть несколько столбцов, которые могут быть обновлены, вам понадобятся побитовые операторы для фильтрации битовой комбинации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...