Разработчик базы данных для решения этой проблемы решил воспользоваться функцией soundex(), специально предусмотренной для этого в SQL Server. Она преобразует слово в алфавитно-цифровое значение, которое представляет базовые звуки слова. Если такое значение создается в момент ввода имени, то поиск имени можно вести по его алфавитно-цифровому значению. Конечно, такой запрос вернет гораздо больше записей, чем нужно, но все они будут отвечать одному произношению.
Для реализации этого компонента в базе данных Jones Novelties нужно выполнить следующие действия:
• изменить таблицу tblCustomer для вставки нового поля LastNameSoundex;
• запустить запрос обновления данных для создания алфавитно-цифровых значений звучания для имен клиентов в таблице tblCustomer;
• создать триггер, который сгенерирует в поле LastNameSoundex алфавитно-цифровое значение звучания для введенного или измененного имени;
• создать хранимую процедуру, которая возвращает всех клиентов с одинаково звучащими именами.
Разработчик базы данных начинает с создания нового поля LastNameSoundex в таблице tblCustomer для хранения в нем алфавитно-цифровых значений звучания имен всех клиентов. Это можно сделать с помощью следующей команды:
ALTER TABLE tblCustomer ADD
LastNameSoundex varchar(4) NULL
Затем разработчику нужно создать и только один раз выполнить команду UPDATE для вычисления алфавитно-цифровых значений звучания уже имеющихся имен в базе данных.
UPDATE tblCustomer
SET LastNameSoundex = soundex(lastName)
GO
SELECT LastName, LastNameSoundex
FROM tblCustomer
GO
Включать команду SELECT в пакет команд SQL после команды UPDATE совсем необязательно, это нужно лишь для того, чтобы разработчик базы данных смог убедиться в правильности выполненных действий.
Далее разработчику нужно создать триггер, чтобы вставить алфавитно-цифровое значение звучания для каждого введенного в базу данных имени нового клиента.
CREATE TRIGGER trCustomerT
ON tblCustomer
FOR insert, update
AS
UPDATE tblCustomer
SET tblCustomer.LastNameSoundex = soundex(tblCustomer.LastName)
FROM inserted
WHERE tblCustomer.ID = inserted.ID
НА ЗАМЕТКУ
Хотя в SQL Server 2000 для одной таблицы допускается определение нескольких триггеров одного типа (для вставки, обновления и удаления), но порядок их выполнения контролируется только частично, т.е. можно указать только первый и последний выполняемый триггер. Для гарантированного выполнения данного триггера после всех триггеров вставки для таблицы tblCustomer (например, триггера присвоения значения столбцу ID) нужно выполнить в программе SQL Query Analyzer следующую команду:
sp_settriggerorder @triggername=@order='last', @stmtype='INSERT'
Причина такой сложной организации триггеров заключается в том, что они выполняются только один раз, даже если операция вставки, обновления или удаления, которая вызвала запуск триггера является частью пакета команд для тысяч записей. Поэтому созданные разработчиком базы данных триггеры должны уметь обрабатывать потенциально неограниченное количество записей.
Для обработки нужного набора записей триггеру должно быть известно, какие записи участвовали в выполнении процедуры, которая привела к ее запуску. Откуда же у триггера такие сведения? Триггеры обладают доступом к этой информации благодаря виртуальным таблицам вставки и удаления. Виртуальная таблица вставки содержит записи, вставленные (или обновленные) процедурой, которая привела к запуску триггера вставки. Аналогично, виртуальная таблица удаления содержит записи, удаленные процедурой, которая привела к запуску триггера удаления.
Поскольку разработчику базы данных в данном примере нужно создать триггер вставки и триггер удаления, то упоминание записей во вставленной виртуальной таблице охватывает все вставленные и удаленные записи, независимо от способа вставки или удаления. Каждая запись в таком случае будет иметь алфавитно-цифровое значение звучания его имени, генерированное триггером.
После создания надежного триггера, который генерирует алфавитно-цифровое значение звучания для имени для каждой записи в таблице tblCustomer, нужно проверить его работоспособность, вставив запись, которую невозможно извлечь с помощью традиционного запроса. Допустим, что в базе данных есть несколько клиентов с именем Smith, и пробуем вставить в нее запись о клиенте Smythe с помощью следующей команды INSERT:
INSERT INTO tblCustomer (FirstName, LastName)
VALUES ('Abigail', 'Smythe')
Теперь работу созданного триггера можно проверить с помощью следующего запроса:
Читать дальше