Ответы к экзамену по БД (542444), страница 9
Текст из файла (страница 9)
DML-события возникают при выполнении инструкций INSERT, UPDATE или DELETE,изменяющих данные в указанной таблице или представлении. DML-триггеры могут обращаться кдругим таблицам и содержать сложные инструкции Transact-SQL. Триггер и инструкция, привыполнении которой он срабатывает, считаются одной транзакцией, которую можно откатить назадвнутри триггера. При обнаружении серьезной ошибки (например, нехватки пространства на диске) всятранзакция автоматически откатывается назад.ПримерCREATE TRIGGER reminder1ON Sales.CustomerAFTER INSERT, UPDATEAS RAISERROR ('Notify Customer Relations', 16, 10);Чтобы управлять срабатыванием DML-триггера, можно указать один из двух параметров.• Триггеры AFTER срабатывают после обработки действия, вызывающего срабатывание (INSERT,UPDATE или DELETE), триггеров INSTEAD OF и ограничений. Триггеры AFTER можноустанавливать путем указания ключевых слов AFTER или FOR.
Так как эффект от ключевогослова FOR тот же, что и от AFTER, DML-триггеры с ключевым словом FOR также относятся ктриггерам AFTER.• Триггеры INSTEAD OF срабатывают вместо действия, вызывающего срабатывание, и передобработкой ограничений. Если в таблице имеются триггеры AFTER, они сработают послеобработки ограничений. В случае нарушения ограничений выполняется откат действийтриггеров INSTEAD OF, а триггер AFTER не срабатывает.В каждой таблице или представлении может быть один триггер INSTEAD OF для каждого из действий,вызывающих срабатывание (UPDATE, DELETE или INSERT). Таблица может содержать несколькотриггеров AFTER для каждого из вызывающих срабатывание действий.Операторы создания, измененияDML Trigger[CREATE|ALTER] TRIGGER trigger_nameON { table | view }{ FOR | AFTER | INSTEAD OF }{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }AS { sql_statement }DDL Trigger[CREATE|ALTER] TRIGGER trigger_nameON { ALL SERVER | DATABASE }{ FOR | AFTER } { event_type | event_group } [ ,...n ]AS { sql_statement }Logon Trigger[CREATE|ALTER] TRIGGER trigger_nameON ALL SERVER{ FOR| AFTER } LOGONAS { sql_statement }Операторы удаленияDML TriggerDROP TRIGGER [schema_name.] trigger_name [ ,...n ] [ ; ]DDL TriggerDROP TRIGGER trigger_name [ ,...n ]ON { DATABASE | ALL SERVER }Logon TriggerDROP TRIGGER trigger_name [ ,...n ]ON ALL SERVERОператоры включения, выключения[ENABLE|DISABLE] TRIGGER { trigger_name [ ,...n ] | ALL }ON { object_name | DATABASE | ALL SERVER }24.
Т-SQL. Ссылочная целостность. Правила ссылочной целостности иподдержка их с помощью триггеров. Примеры.Ссылочная целостность. База данных не должна содержать каких-либо несогласованных значений внешнегоключа. В этом определении термин "несогласованное значение внешнего ключа" обозначает значениевнешнего ключа в некоторой ссылающейся переменной отношения, для которого не существуетсогласованного значения соответствующего потенциального ключа в соответствующей переменнойотношения, указанной в ссылке.
Иными словами, это ограничение можно сформулировать просто какследующее требование: "Если значение В ссылается на А, то А должно существовать".Ссылочная целостность сохраняет определенные связи между таблицами при добавлении или удалениистрок. В SQL Server ссылочная целостность основана на связи первичных и внешних ключей (либо внешних иуникальных ключей) и обеспечивается с помощью ограничений FOREIGN KEY и CHECK. Ссылочная целостностьгарантирует согласованность значений ключей во всех таблицах. Этот вид целостности требует отсутствияссылок на несуществующие значения, а также обеспечивает согласованное изменение ссылок во всей базеданных при изменении значения ключа.При обеспечении ссылочной целостности SQL Server не допускает следующих действий пользователей.• Добавления или изменения строк в связанной таблице, если в первичной таблице нетсоответствующей строки.• Изменения значений в первичной таблице, которое приводит к появлению потерянных строк всвязанной таблице.• Удаления строк из первичной таблицы, если имеются соответствующие ей строки в связанныхтаблицах.Ограничение FOREIGN KEY предотвращает возникновение ситуации несогласованности.
Ограничениеобеспечивает целостность ссылок следующим образом: оно запрещает изменение данных в таблицепервичного ключа, если такие изменения сделают недопустимой ссылку в таблице внешнего ключа. Если припопытке удалить строку в таблице первичного ключа или изменить значение этого ключа окажется, чтоудаленному или измененному значению первичного ключа соответствует значение в ограничении FOREIGNKEY в другой таблице, то действие выполнено не будет. Для успешного изменения или удаления строки сограничением FOREIGN KEY необходимо сначала удалить данные внешнего ключа в соответствующей таблицелибо изменить данные в таблице внешнего ключа, которые связывают внешний ключ с данными другогопервичного ключа.Поддержка ссылочной целостности с помощью триггеровТриггеры DML часто используются для соблюдения бизнес-правил и целостности данных. В SQL Serverдекларативное ограничение ссылочной целостности обеспечивается инструкциями ALTER TABLE и CREATETABLE.
Однако декларативное ограничение ссылочной целостности не обеспечивает ссылочную целостностьмежду базами данных. Ограничение ссылочной целостности подразумевает выполнение правил связи междупервичными и внешними ключами таблиц. Для обеспечения ограничений ссылочной целостностииспользуйте в инструкциях ALTER TABLE и CREATE TABLE ограничения PRIMARY KEY и FOREIGN KEY. Еслиограничения распространяются на таблицу триггера, они проверяются после срабатывания триггера INSTEADOF и до выполнения триггера AFTER. В случае нарушения ограничения выполняется откат действий триггераINSTEAD OF, и триггер AFTER не срабатывает.Пример использования триггеров для поддержки ссылочной целостности – каскадное удаление илиобновление данныхПример каскадного удаленияCREATE TRIGGER delTrigger ON vuz_gorodFOR DELETE ASBEGINDELETE vuzFROM deleted,vuzWHERE vuz.cod=deleted.cod_vuzaENDПример каскадного обновленияCREATE TRIGGER updTrigger ON vuz_gorodfor update asbeginupdate vuzset vuz.cod = inserted.cod_vuza, vuz.uch_zavedenie = inserted.nazvanie_vuzafrom deleted, vuz, insertedwhere ((deleted.cod_vuza = vuz.cod)or (deleted.nazvanie_vuza = vuz.uch_zavedenie))end25.
Т-SQL. Персональные, списковые и количественные запросы. Агрегатныефункции. Особенности использования фразы group by. Реализацияколичественного запроса по одному или нескольким столбцам сиспользованием Т-SQL. Примеры.Агрегатные функцииАгрегатные функции предназначены для того, чтобы вычислять некоторое значение для заданного множествастрок. Таким множеством строк может быть группа строк, если агрегатная функция применяется ксгруппированной таблице, или вся таблица.
Для всех агрегатных функций, кроме COUNT(*), фактический (т.е.требуемый семантикой) порядок вычислений следующий: на основании параметров агрегатной функции иззаданного множества строк производится список значений. Затем по этому списку значений производитсявычисление функции.
Если список оказался пустым, то значение функции COUNT для него есть 0, а значениевсех остальных функций - null.Вычисление функции COUNT(*) производится путем подсчета числа строк в заданном множестве. Все строкисчитаются различными, даже если они состоят из одного столбца со значением null во всех строках.Стандартом предусмотрены следующие агрегатные функции:ФункцияОписаниеCOUNT(*)Возвращает количество строк источника записей.COUNT(<имя поля>)Возвращает количество значений в указанном столбце.SUM(<имя поля>)Возвращает сумму значений в указанном столбце.AVG(<имя поля>)Возвращает среднее значение в указанном столбце.MIN(<имя поля>)Возвращает минимальное значение в указанном столбце.MAX(<имя поля>)Возвращает максимальное значение в указанном столбце.Все эти функции возвращают единственное значение.
При этом функции COUNT, MIN и MAX применимы клюбым типам данных, в то время как SUM и AVG используются только для числовых полей. Разница междуфункцией COUNT(*) и COUNT(<имя поля>) состоит в том, что вторая при подсчете не учитывает NULL-значения.Предложение GROUP BYПредложение GROUP BY позволяет вам определять подмножество значений в особом поле в терминахдругого пол, и применять функцию агрегата к подмножеству. Это дает вам возможность объединять пол и агрегатные функции ведином предложении SELECT. Например, предположим что вы хотите найти наибольшую сумму приобретений полученную каждымпродавцом. Вы можете сделать раздельный запрос для каждого из них, выбрав MAX (amt) из таблицы Порядков для каждого значенияпол snum. GROUP BY, однако, позволит Вам поместить их все в одну команду:=============== SQL Execution Log ==============||| SELECT snum, MAX (amt)|| FROM Orders|| GROUP BY snum;|| =============================================== || snum|| ------ -------|| 1001 767.19|| 1002 1713.23|| 100375.75|| 1014 1309.95|================================================GROUP BY применяет агрегатные функции независимо от серий групп которые определяются с помощьюзначения поля в целом.