Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Новости сайта "Упражнения по SQL" (http://www.sql-ex.ru) 96


Новости сайта "Упражнения по SQL (http://www.sql-ex.ru)" Выпуск 96 (15 июля 2006 г.)

http://www.sql-ex.ru

Новым посетителям сайта

Сайт посвящен изучению языка, с помощью которого осуществляется взаимодействие с реляционными (и не только) СУБД. Суть обучения состоит в выполнении заданий на написание запросов к учебным базам данных; при этом система контролирует правильность выполнения заданий. В настоящее время реализованы все операторы подъязыка манипуляции данными (DML), которые включают в себя оператор извлечения данных SELECT, а также операторы модификации данных - INSERT, DELETE и UPDATE.

Мы надеемся, что справочного материала сайта окажется достаточно для самостоятельного обучения. Кроме того, свои решения вы можете обсудить на форуме сайта. Опытных же специалистов приглашаем проверить (продемонстрировать) свое мастерство и принять участие в соревновании, обеспечиваемом рейтинговой системой учета времени выполнения заданий. Фактически, рейтинг ведется на втором этапе тестирования, который начинается сейчас после решения 58-ти задач первого этапа. При подсчете рейтинга каждого участника отбрасывается один самый худший показатель среди всех решенных им упражнений.

Демонстрация плана выполнения запроса и сравнительная оценка эффективности решений поможет вам освоить принципы оптимизации запросов.

Имеется возможность получить сертификат по SQL DML при выполнении определенного количества заданий.


Новости сайта

§ Собрал отзывы о сайте, опубликованные на форумах и высказанные в переписке. С первой частью уже можно ознакомиться здесь

§ Появился поиск по сайту от Гугл. Правда он находится на сайте "Книги и статьи по SQL". Поиск выполняется по страницам, не требующим авторизации, т.е. по форуму пока поиска нет. Это в планах на будущее.

§ Выставил новую задачу от Roman S. Golubin. Ее номер 87, сложность 3 балла. Уже есть первые решившие, так что можно приблизительно оценить ее реальную сложность.
Лидер рейтинга Snowbear (138, 4.038) тоже решил эту задачу, оставив автора пока на второй позиции.

§ Новый человек в сотне:
Squid (задач 101, время 5.141)

§ Вошла в 20-ку vlksm(137, 22.350), решив новую задачу 87. У нее есть шансы попасть в десятку, если достаточно быстро будет решена 138 задача. Давно пора разбавить мужской коллектив :-).

 

§ Сохранили шансы попасть в ТОР 10:
a2010 (136, 11.292)
=Maxim= (117, 7.484)

§ Продолжили свое восхождение к вершине:
SoVa (123, 87.147)
FanOfBeer (117, 66.363)
ba (116, 35.296)
Ocean (106, 24.041)

§ На этой неделе улучшил качество своего сертификата:
SoVa (B06007933) [AR] (г.Богданович, Россия)

§ Число подписчиков - 3197

Число участников рейтинга - 6542

Число участников второго этапа - 612

Сертифицировано на сайте - 76

Лучшие результаты (ТОР 20)

No Person Number of
Sel_ex
Last_Sel Number of
DML_ex
Scores Days Days_2 LastSolved LastVisit
1 >Юлдашев М.Р. (Snowbear) 138 87 20 321 361 4.038 14 Jul 2006 14 Jul 2006
2 >Голубин Р.С. (Roman S. Golubin) 138 87 20 321 330 20.825 14 Jul 2006 14 Jul 2006
3 Кувалкин К.С. (Cyrilus) 137 138 20 318 484 5.444 23 Mar 2006 14 Jul 2006
4 Slobodcicov A.N. (Testo) 137 138 20 318 252 6.711 01 Jun 2006 23 Jun 2006
5 Kamaev V.M. (Heromantor) 137 138 20 318 128 9.060 14 Mar 2006 25 Mar 2006
6 Мурашкин И.В. (lepton) 137 138 20 318 81 9.915 12 Jun 2006 26 Jun 2006
7 Бураков С.Г. (burakov58) 137 138 20 318 419 17.384 24 Mar 2006 07 Apr 2006
8 Иванов А.Н. (Goapsy) 137 138 20 318 211 18.275 09 Jun 2006 09 Jun 2006
9 Тарасов Д.Б. (Gavrila) 137 138 20 318 208 19.398 22 Mar 2006 14 Jul 2006
10 Валуев Д.И. (Fiolent) 137 138 20 318 971 47.987 02 May 2006 14 Jul 2006
11 >Карасёва Н. (vlksm) 137 87 20 317 69 22.350 14 Jul 2006 14 Jul 2006
12 Войнов П.Е. (pаparome) 136 137 20 314 203 1.766 15 Mar 2006 11 Jul 2006
13 Зверев Д.Л. (dimzv) 136 137 20 314 869 3.274 22 Mar 2006 08 Jul 2006
14 Абашин П.И. (Dizil) 136 137 20 314 203 3.773 15 Mar 2006 04 Jul 2006
15 Самохвалов В. (ValdemarES) 136 137 20 314 117 7.786 14 Mar 2006 03 Jul 2006
16 Носков Н.В. (niko2) 136 137 20 314 274 8.468 06 Apr 2006 16 May 2006
17 Крижевич С.А. (yaff) 136 137 20 314 259 14.797 16 Mar 2006 05 May 2006
18 Держальцев В.А. (MadVet) 136 137 20 314 357 18.631 08 Apr 2006 08 Jul 2006
19 Зырин В.Е. (Vezyr) 136 137 20 314 63 20.601 17 Mar 2006 20 Jun 2006
20 Страшников А.С. (EffEct) 136 137 20 314 305 59.961 16 Mar 2006 02 May 2006

Лучшие результаты за неделю

No surname n_sel sel_all sel_scores dml_scores scores rating last_visit
1 Богданов А.А. (Alexey Danov) 60 60 109 0 109 640 14 Jul 2006
2 Панасик Р.Я. (Панас) 58 58 107 0 107 659 13 Jul 2006
3 >Виноградов А. (andrewv) 37 64 75 23 98 329 14 Jul 2006
4 >Биндарев (Ivan_) 48 65 98 0 98 534 14 Jul 2006
5 horia (shodaaan) 41 41 83 9 92 931 12 Jul 2006
6 >Socolov A.I. (Socolov) 49 49 84 1 85 1036 14 Jul 2006
7 Sirotinkin A.E. (Garkin) 41 48 78 3 81 987 14 Jul 2006
8 >Voronin (Koba) 45 45 74 0 74 1247 14 Jul 2006
9 Tutisani T. (Non-Pro) 40 40 73 0 73 1264 13 Jul 2006
10 >Шушунов (Kite) 39 39 70 3 73 1265 14 Jul 2006
11 >Солеников Д. (DAS) 21 57 40 32 72 338 14 Jul 2006
12 >Лапшов М.В. (MikeLp) 38 38 63 9 72 1299 14 Jul 2006
13 shtril I. (imsh) 36 64 61 9 70 276 13 Jul 2006
14 Егизбаев (Талгат) 37 37 64 0 64 1470 13 Jul 2006
15 >Andrei M.R. (3nder) 35 35 62 0 62 1535 14 Jul 2006
16 >Терентьев А. (andr_t) 39 39 58 3 61 1571 14 Jul 2006
17 >Spagnola (spags) 27 51 59 0 59 955 14 Jul 2006
18 >Mischa (Mischa) 33 33 57 0 57 1715 14 Jul 2006
19 >Fisherman M.V. (Max-xaM) 24 51 42 14 56 713 14 Jul 2006
20 Caldwell D.P. (War Eagle) 25 40 56 0 56 1267 10 Jul 2006
21 Афанасьев В.В. (TorroT) 15 57 36 19 55 495 14 Jul 2006
22 Иванов И.И. (seven) 28 47 55 0 55 1111 11 Jul 2006
23 Ciprian T. (Pedro) 28 28 49 0 49 1967 14 Jul 2006
24 >Murzin A.V. (andreu_m) 28 28 49 0 49 1984 14 Jul 2006
25 Stasiuc A. (Cyberex) 28 28 49 0 49 1988 12 Jul 2006
26 >Макаров Е.М. (Kronic) 25 25 40 9 49 1991 14 Jul 2006
27 Lesyuk V. (Vales) 28 28 49 0 49 1993 13 Jul 2006
28 >Alexin (tnkbp213) 28 28 49 0 49 1999 14 Jul 2006
29 >Колпаков А. (АлександрI) 13 60 31 17 48 364 14 Jul 2006
30 Александров В.Ю. (vitek001) 33 33 46 1 47 2082 13 Jul 2006
31 Цаллагов И. (Polyphemos) 7 66 14 32 46 250 14 Jul 2006
32 >Артемьев А.В. (Artalex) 24 24 37 9 46 2106 14 Jul 2006
33 Мариненко А.А. (nova5) 13 51 36 8 44 585 14 Jul 2006
34 Polyakov A.S. (polyakov) 26 26 43 0 43 2213 13 Jul 2006
35 Сухнев Д.А. (dm_den) 32 32 43 0 43 2219 13 Jul 2006
36 >Kolenoff A.A. (AlexCat) 21 28 42 0 42 2016 14 Jul 2006
37 Трофимов В.С. ((*V*)) 16 39 26 14 40 1180 14 Jul 2006
38 Demshevsky (Igor_dema) 25 25 40 0 40 2324 13 Jul 2006
39 Юрловский С. (serjee) 24 24 37 3 40 2338 13 Jul 2006

Изучаем SQL

Выполнение триггеров в определенном порядке

Dinesh Asanka (оригинал: Triggers to Execute in Pre Defined Order)
Перевод Моисеенко С.И.

Введение

Проблема, с которой я столкнулся, довольно известна. Я имею два триггера, которые должны отработать в предопределенном порядке, т.е. триггер A должен выполниться сначала, а после него должен отработать триггер B. Вы можете поинтересоваться, а почему бы не иметь один триггер, который объединит триггеры A и B в один триггер AB? Хороший вопрос. К сожалению, триггер A используется для репликации (For Replication), в то время как более поздний триггер - не для репликации, что определяет наличие именно двух триггеров.

Давайте создадим испытательную среду. Для этого нам понадобятся две таблицы. Одна - для написания и тестирования триггеров, а вторая - для журнализации триггера и времени его выполнения.

CREATE TABLE [Trigger Priority] (
[Id] [int] IDENTITY (1, 1) NOT NULL ,
[First] [int] NULL ,
[Second] [int] NULL ,
[Last] [int] NULL ,
[Status] [char] (1) NULL
) ON [PRIMARY]
GO

Один триггер будет триггером на вставку, который будет обновлять столбец First некоторым случайным числом. Этот триггер будет называться trg_UpdateFirst

CREATE TRIGGER trg_UpdateFirst ON dbo.[Trigger Priority]
FOR INSERT
AS
declare @id int, @val as float
Select @id = id from inserted
select @val = floor(rand() * 10)
Update [Trigger Priority] set [First] = @val Where ID = @id
Insert into TriggerLog (TriggerName) values ('trg_UpdateFirst')

Последняя строка триггера журнализирует имя триггера и время его срабатывания в таблице TriggerLog. Следующий триггер используется для обновления столбца Second значением из столбца First.

CREATE TRIGGER trg_UpdateSecond ON dbo.[Trigger Priority]
FOR INSERT
AS
declare @id int
Select @id = id from inserted
Update [Trigger Priority] set [Second] = [First] Where ID = @id
Insert into TriggerLog (TriggerName) values ('trg_UpdateSecond')

Последний триггер используется для обновления столбца Last суммой значений столбцов First и Second.

CREATE TRIGGER trg_UpdateLast ON dbo.[Trigger Priority]
FOR INSERT
AS
declare @id int
Select @id = id from inserted
Update [Trigger Priority] set [Last] = [First] + [Second] Where ID = @id
Insert into TriggerLog (TriggerName) values ('trg_UpdateLast')

Теперь, чтобы получить ожидаемые результаты, триггеры trg_UpdateFisrt, trg_UpdateSecond и trg_UpdateLast должны выполняться в вышеперечисленном порядке. Что вы об этом думаете? Каков будет порядок? Случайным образом или в некотором особом порядке?

Прежде чем ответить на этот вопрос, давайте посмотрим, что произойдет. После вставки одной записи в таблицу [Trigger Priority] первый столбец содержит пятерку, что нормально, и второй тоже - 5, что также правильно. Однако в последнем столбце находится NULL! Почему? Разве не должно быть 10?

Теперь давайте проверим таблицу TriggerLog. Порядок столбцов - trg_UpdateLast, trg_UpdateFirst и trg_UpdateSecond. После небольшого исследования выясняется, что триггеры выполняются в том порядке, в котором они были созданы. Таким образом, в идеале триггеры следует создавать в таком порядке: trg_UpdateFirst, trg_UpdateSecond и trg_UpdateLast. Это ни в коем случае не является простой задачей в силу динамического характера процесса разработки, который по большей части не контролируется разработчиками.

Другой вопрос. Как на более поздней стадии Вы собираетесь узнать о порядке срабатывания триггеров?

select * from sysobjects where xType ='TR' order by id

С помощью вышеупомянутого запроса Вы можете идентифицировать порядок, в котором выполнятся триггеры.

Установить порядок

Теперь вопрос о том, как мы можем задать порядок выполнения. Имеется хранимая системная процедура, которая для того и существует, чтобы ответить на подобный вопрос. Эта хранимая процедура - sp_settriggerorder. У этой SP есть три параметра.

sp_settriggerorder [@triggername =] 'triggername'
, [@order =] 'значение'
, [@stmttype =] 'statement_type'

Первый параметр - это имя триггера, а второй параметр - порядок. Этот порядок может принимать одно из трех значений: " First (первый)", "None (ни первый, ни последний)", и " Last (последний)". Последний параметр представляет собой тип триггера, т.е. Insert, Update или Delete. Это означает, что Вы не можете позволить себе иметь четыре или пять триггеров одного и того же типа, которые бы выполнялись в определенном порядке. Однако это вряд ли встречается в практике. По крайней мере, я не встречал еще так много триггеров одного типа на одной таблице.

Этот порядок не может быть установлен опциями Alter Trigger или Create Trigger. Если оператор Alter Trigger изменяет первый или последний триггер, то первоначально установленные на триггере атрибуты First или Last удаляются, и значение заменяется на None. Значение порядка должно быть переустановлено с помощью хранимой процедуры sp_settriggerorder.

Разрешения

Владелец триггера и таблицы, на которой определен триггер, имеет разрешение на выполнение sp_settriggerorder. Члены ролей db_owner и db_ddladmin в текущей базе данных, так же как серверная роль sysadmin, могут выполнять эту хранимую процедуру.

Получение порядка

Следующая проблема заключается в установлении порядка, в котором выполняются триггеры, на более поздней стадии. Если я не ошибаюсь, нет никакого прямого способа получить эту информацию из Enterprise Manager SQL Server. Вместо этого Вы пишете простые запросы.

select objectproperty(object_id(' trg_UpdateFirst '), 'ExecIsFirstInsertTrigger') ExecIsFirstInsertTrigger')

укажет, является ли trg_UpdateFirst первым (First) триггером на вставку?

Предостережения

Когда Вы генерируете скрипт для триггеров, приоритет их срабатывания не будет заскриптован. Это означает, что Вам придется повторно запустить приоритетные сценарии. Это аргумент в пользу отказа от приоритетных триггеров.

Сервер SQL 2005

В SQL Server 2005 имеется дополнительный параметр в sp_settriggerorder, который должен сообщить, является ли данный триггер триггером базы данных или триггером сервера. Это обусловлено тем, что в SQL Server 2005 Вы можете написать также DDL триггеры.

Заключение

Установка приоритетного порядка для триггера SQL Server не составляет труда. Однако Вы должны взять на себя дополнительную заботу, принимая эту возможность в структуре вашей разработки. Будет хорошо, если Microsoft может обеспечить решения для рассмотренных выше проблем.

06/04/2006

Полезная информация

§ Интересная таблица, в которой сравниваются конфигурационные параметры для SQL Server 2000 и SQL Server 2005. Представлены диапазоны возможных значений и значения по умолчанию: http://www.sql-server-helper.com/sql-server-2005/configuration-options.aspx

§ Все статьи, публикуемые в рассылке, затем выкладываются на сайте Книги и статьи по SQL.

§ Поступила в продажу книга SQL. Задачи и решения, посвященная анализу ошибок, допускаемых при решении задач первого этапа. На сайте издательства Питер можно сделать заказ и познакомиться с содержанием.

Контакты

По всем вопросам, связанным с функционированием сайта, проблемами при решении упражнений, идеями вы можете обращаться к Сергею И.Моисеенко msi77@yandex.ru. Вы также можете предложить свои задачи для публикации на сайте.

Подписка Subscribe.Ru
Новости сайта "Упражнения по SQL"

В избранное