Программирование >>  Программирование баз данных 

1 ... 158 159 160 [ 161 ] 162 163 164 ... 346


Безусловно, действие триггера INSTEAD OF DELETE не распространяется на отдельные столбцы (поскольку удаление происходит по строкам, а не по столбцам), но в действительности необходимо знать о том, какие средства ссылочной целостности определены на таблице (речь не идет о представлении), для которой определен триггер INSTEAD OF DELETE. Триггеры INSTEAD OF DELETE, как и триггеры INSTEAD OF UPDATE, не разрешается определять по отношению к таблицам, в которых предусмотрено применение средств поддержки ссылочной целостности.

Использование функций

update () И columns updated ()

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

Функция UPDATE ()

Применение функции UPDATE () имеет смысл только в области определения триггера. Единственное назначение этой функции состоит в том, что с ее помощью выясняется, обновлялся ли какой-то конкретный столбец или нет. Функция возвращает результат проверки в виде булева значения (true или false). Эта функция позволяет определить, должен ли быть вызван на вьшолнение какой-то конкретный блок кода, например, код, применение которого имеет смысл, только если обновляется какой-то определенный столбец.

Рассмотрим краткий пример применения функции UPDATE (), представляющий собой один из описанных ранее триггеров, в который внесены соответствующие изменения:

ALTER TRIGGER Production.ProductAudit ON Production.ProductInventory FOR INSERT, UPDATE, DELETE

IF UPDATE(Quantity) BEGIN

INSERT INTO Production.InventoryAudit (ProductID, NetAdjustment)

SELECT COALESCE(i.ProductID, d.ProductID),

ISNULL(i.Quantity, 0) - ISNULL(d.Quantity, 0) AS NetAdjustment FROM Inserted i FULL JOIN Deleted d

ON i.ProductID = d.ProductID AND i.LocationID = d.LocationID WHERE ISNULL(i.Quantity, 0) - ISNULL(d.Quantity, 0) != 0

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



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

Функция COLUMNS UPDATED ()

Функция COLUiyiNS UPDATED () действует немного иначе, чем функция UPDATE (), но имеет такое же общее назначение. Дополнительные возможности функции COLUMNS UPDATED () обусловлены тем, что эта функция позволяет проверить, обновляется ли одновременно несколько столбцов. Для этого в функции применяется битовая маска, которая связывает отдельные биты в одном или нескольких байтах данных типа varbinary с отдельными столбцами таблицы. В результате вызова функции COLUMNS UPDATED () формируется битовая маска, которая выглядит примерно так, как показано на рис. 13.4.


Рис. 13.4. Однобайтовая битовая маска

На рис. 13.4 видно, что битовая маска состоит из одного байта данных, который содержит информацию о том, что обновлены данные во втором, в третьем и шестом столбцах, а остальные столбцы остались незатронутыми.

В том случае, если количество столбцов превышает восемь, шестнадцать и т.д., в СУБД SQL Server добавляется еще один байт справа и отсчет столбцов продолжается (рис. 13.5).


Первый байт

Второй байт

Рис. 13.5. Двухбайтовая битовая маска

В этот раз произошло обновление второго, девятого и четырнадцатого столбцов.



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

Для этого прежде всего необходимо подготовить контрольную битовую маску (представленную в виде десятичного числа), сложив двоичные значения всех битов, отсчитываемые слева направо. Таким образом, если необходимо определить, было ли выполнено обновление столбцов 2, 5 и 7, необходимо сложить двоичные значения битов, соответствуюш;их этим столбцам: 2 + 16 + 64. После этого результаты вызова функции COLUMNS UPDATED () сравниваются с полученной контрольной битовой маской с помош;ью описанных ниже операторов побитовой обработки.

I. Побитовая операция Р1ЛИ .

Sc. Побитовая операция И .

. Побитовая операция исключительное ИЛИ .

Чтобы было проще понять приведенное выше описание, рассмотрим несколько примеров.

Предположим, что выполнено обновление таблицы, которая содержит пять столбцов. Если необходимо узнать, обновлены ли первый, третий и пятый столбцы, то следует прелсде всего подготовить битовую маску, предназначенную для проверки возвращаемого значения функции COLUMNS UPDATED (), которая содержала бы двоичное значение 10101000, или десятичное значение 1 + 4 + 16 = 21. После этого можно применить приведенные ниже выражения.

COLUMNS UPDATED () > 0. Это выражение позволяет узнать, был ли вообще обновлен какой-либо столбец.

COLUMNS UPDATED () 21 = 0. С помощью этого выражения можно определить, произошло ли обновление только указанных столбцов (в этом случае столбцов 1, 3 и 5).

COLUiyiNS UPDATED () & 21 = 21. Это выражение позволяет выяснить, произошло ли обновление всех указанных столбцов, если состояние всех прочих столбцов не представляет интереса.

COLUiyiNS UPDATED 21 1= 21. Выражение, которое дает возможность узнать, был ли обновлен какой-либо столбец, кроме тех, которые нас интересуют.

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

Рекомендации по повышению производительности триггеров

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



1 ... 158 159 160 [ 161 ] 162 163 164 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика