ГЛАВА 1 ОСНОВНЫЕ СВОЙСТВА ERwin
Глава 16 Триггеры и Хранимые Процедуры Содержание главы Автоматизируя создание кода SQL, ER win тем самым позволяет Вам использовать две усовершенствованные возможности - триггеры и хранимые процедуры, которые поддерживаются некоторыми СУБД SQL. Триггеры и хранимые процедуры - это именованные блоки кода SQL, которые заранее откомпилированы и хранятся на сервере для того, чтобы быстро производить выполнение запросов, валидацию данных и выполнять другие, часто вызываемые функции. Имеется несколько достоинств использования триггеров и хранимых процедур. Если Вы сохраняете эти команды на сервере, то Вам нужно создавать код только один раз, а не в каждом приложении, работающем с базой данных. Это экономит время при написании программ. Далее, поскольку коды хранятся на сервере, то их не требуется пересылать по сети из клиентского приложения, что значительно снижает сетевой траффик. И наконец, сохраняя коды на сервере, Вы тем самым гарантируете, что целостность данных и правила (business rules) поддерживаются единым образом, независимо от того, какое именно клиентское приложение обращается к данным. В этой главе Вы узнаете, как: · Управлять операциями вставки, обновления и удаления таким образом, чтобы поддерживать целостность данных. · Связывать правила ссылочной целостности, устанавливаемые по умолчанию, со связями ERwin. · Использовать шаблоны и макрокоманды ERwin для автоматизации процесса создания триггеров и хранимых процедур. · Переопределять триггеры ссылочной целостности, устанавливаемые ERwin по умолчанию. · Создавать адаптированные к конкретной ситуации шаблоны для задания хранимых процедур. · Связывать хранимые процедуры с отдельными сущностями. · Связывать хранимые процедуры со схемой базы данных. Что такое триггеры? Триггером называется именованный набор прекомпилированных команд SQL, хранящийся на сервере, который автоматически выполняется, когда происходит заданное событие. Например, триггер может выполняться при вставке, изменении или удалении строки в существующей таблице. Триггер сообщает СУБД, как нужно выполнять команды SQL INSERT, UPDATE или DELETE, чтобы выполнялись нормальные правила (business rules) организации. Триггер ссылочной целостности - особый вид триггера, используемый для поддержания целостности между двумя таблицами, которые связаны между собой. Если строка в одной таблице вставляется, изменяется или удаляется, то триггер ссылочной целостности (который мы далее будем называть RI-триггером) сообщает СУБД, что нужно делать с теми строками в других таблицах, у которых значение внешнего ключа совпадает со значением первичного ключа вставленной (измененной, удаленной) строки. Предположим, например, что в фирме проката видеопродукции существует правило, согласно которому фильм нельзя удалять из списка, если какие-то копии этого фильма в данный момент находятся на руках. Что произойдет, если Вы попытаетесь удалить название фильма, в то время как копия этого фильма находится на руках? Если Ваша СУБД поддерживает RI-триггеры, то команда DELETE языка SQL может быть обработана одним из следующих способов: · Запрещается удаление фильма из таблицы MOVIE. Правило ссылочной целостности, запрещающее вставку, изменение или удаление строки, называется RESTRICT. · Фильм удаляется из таблицы MOVIE и все строки в таблицах MOVIE-COPY и MOVIE-RENTAL-RECORD с тем же номером фильма, что и у удаленной строки, также автоматически удаляются. Правило ссылочной целостности, передающее изменение от одной таблицы к другой, называется CASCADE. Обратите внимание, что если Вы примените это правило ссылочной целостности к данной ситуации с фильмом, у Вас не будет возможности проследить за той копией удаленного фильма, которая находится на руках. Для таких ситуаций Вы можете переопределить триггер ссылочной целостности, устанавливаемый по умолчанию, так что информация о копии фильма и о том, у кого она находится, не стиралась бы случайно. · Фильм удаляется из таблицы MOVIE, но номеру фильма для той копии, которая находится на руках, в таблице MOVIE-RENTAL-RECORD автоматически присваивается нулевое значение (пустое поле), что говорит о том, что Вы больше не планируете работать с этим фильмом. После того как последняя копия фильма будет возвращена, ее можно выставить для окончательной продажи, а не возвращать на нормальный склад для последующейсдачи в прокат. Правило ссылочной целостности, изменяющее текущее значение данных на нулевое, называется SET NULL. · Хотя Вы и не можете использовать триггеры для усиления ссылочной целостности, если у Вас установлена РС-ориентированная СУБД, ERwin все-таки предоставляет альтернативный способ усиления ссылочной целостности в случае СУБД Fox Pro. См. руководство по ERwin для РС-ориентированных СУБД, ERwin Desktop Database Guide, разд. “Усиление ссылочной целостности для таблиц Fox Pro”. ERwin располагает шестью RI-триггерами, устанавливаемыми по умолчанию, которые Вы можете связывать с сущностями, чтобы указывать Вашей СУБД, как ей усиливать ссылочную целостность. В особых ситуациях Вы можете переопределить код, генерируемый ERwin по умолчанию, изменяя эти шаблоны триггеров в соотсветствии с Вашей ситуацией. Что такое хранимые процедуры? Хранимой процедурой называется именованный набор прекомпилированных команд SQL, который работает точно так же, как и триггер, с той разницей, что он обычно вызывается из другой программы, а не выполняется автоматически, как реакция на событие. Например, в конце каждого месяца фирма по прокату видеопродукции может захотеть получить список всех фильмов, которые никто не брал в последние 30 дней, и выставить их на распродажу. Чтобы ускорить выполнение этого рутинного запроса, Вам нужно создать хранимую процедуру под названием “sp_norental”, выдающую список всех фильмов, которые никто не брал за последний месяц. В последний день каждого месяца, когда Вы выбираете эту процедуру из меню клиентского приложения, клиент пересылает по сети на сервер только имя хранимой процедуры, и сервер автоматически выполняет все коды, связанные с этим именем. Поскольку весь код процедуры хранится на сервере, Вам не нужно писать все команды SQL, нужные для выполнения запроса, и пересылать их по сети каждый раз, когда Вы хотите найти фильмы, на которые нет спроса, и убрать их со склада. Поскольку триггеры и хранимые процедуры имеют большое значение для ускорения работы и поддержания целостности, ERwin располагает специальными редакторами Trigger и Stored Procedure со встроенными шаблонами и мощными макрокомандами, которые могут существенно ускорить процесс создания этих процедур SQL. В первой части данной главы описывается, как использовать RI-триггеры, устанавливаемые ERwin по умолчанию, и как переопределить их, изменяя встроенные шаблоны. Во второй части главы описывается, как создавать в ERwin новые шаблоны, которые Вы можете использовать для создания встроенных процедур, которые могут обрабатывать практически любой тип часто используемой операции с базой данных. Подробная информация по макроязыку шаблонов ERwin приведена в конце главы. RI-триггеры, устанавливаемые ER win по умолчанию Для того чтобы создать триггер, Вам в обычном случае требуется ввести нужный код SQL и поместить его на сервер. Чтобы сэкономить Ваше время, ER win предлагает Вам набор шаблонов RI-триггеров, устанавливаемых по умолчанию, которые используют для автоматической генерации кода SQL предопределенные макрокоманды. Макрокоманды ERwin содержат скелетный код языка SQL, в который вставляются при генерации физической схемы базы данных имена таблиц и другие переменные. Ниже приводятся примеры макро-кода триггера ERwin и расширенного кода, который экспортируется из ЕRwin на сервер в процессе генерации схемы. /* ERwin Builtin %Datetime */ /* %Parent %Verbphrase %Child ON PARENT DELETE RESTRICT */ if exists ( select * from deleted, %Child where /* %%JoinFKPK(%Child, deleted, “ = “, “ and”) */ %JoinFKPK(%Child, deleted, “ = “,” and”) ) begin select @errno = 30001, @ errmsg = ‘Cannot DELETE “%Parent” because “%Child” exists. ‘ goto error end Рис. 16.2. Пример макрокода - часть шаблона RI-триггера. create trigger tDMOVIE on MOVIE for DELETE as /* ERwin Builtin Wed Aug 24 20:33:33 1994 */ /* DELETE trigger on MOVIE */ begin declare @errno int, @ errmsg varchar(255) /* ERwin Builtin Wed Aug 24 20:33:33 1994 */ /* MOVIE is in stock as MOVIE_COPY ON PARENT DELETE RESTRICT */ if exists ( select * from deleted, MOVIE_COPY where /* %JoinFKPK(MOVIE_COPY,deleted, “ = “,” and”) */ MOVIE_COPY.master_number = deleted.movie_number ) begin select @errno = 30001, @errmsg = ‘Cannot DELETE “MOVIE” because “MOVIE_COPY” exists. ‘ goto error end /* ERwin Builtin Wed Aug 24 20:33:33 1994 */ return error: raiserror @errno @errmsg rollback transaction end go Рис. 16.3. Код SQL, расширенный в процессе генерации схемы. Как просмотреть код триггера, устанавливаемого по умолчанию, для сущности 1. Щелкните правой кнопкой мыши по сущности и дайте команду меню Editor “<DB> Trigger”. ERwin открывает окно, предназначенное только для чтения, в котором показан расширенный код для каждого RI-триггера, связанного с этой сущностью. Как создаются триггеры ER win ERwin создает RI-триггеры автоматически. Когда Вы строите свою модель данных, ER win автоматически связывает шаблон RI-триггера, устанавливаемого по умолчанию, с каждой сущностью связи. На то, какой именно шаблон триггера будет присвоен связи и на генерируемый им код SQL влияют три критерия: · Правило ссылочной целостности, которое он применяет к связи (RESTRICT, CASCADE, SET NULL, SET DEFAULT, NONE). · Тип связи, с которым он связан (идентифицирующая или неидентифицирующая). · Роль сущности в связи (родительская или дочерняя). Правила ссылочной целостности Когда триггер связывается с сущностью, он автоматически устанавливается так, чтобы усиливать одно из следующих правил ссылочной целостности, в зависимости от типа связи и роли сущности в этой связи. Правило ссылочной целостности | Что оно делает | RESTRICT | Запрещает СУБД производить требуемое изменение (INSERT, UPDATE или DELETE). | CASCADE | Производит требуемое изменение в первой таблице и распространяет его на связанные с ней таблицы. | SET NULL | Производит требуемое изменение в первой таблице и устанавливает нулевые (пустые) значения внешнего ключа в связанных с ней таблицах. | SET DEFAULT | Работает. как SET NULL, с той разницей, что вместо нулевого значения присваивает внешним ключам значение по умолчанию. | NONE | Ничего не делает (ERwin не усиливает ссылочную целостность). | ERwin создает RI-тригеры автоматически, связывая шаблоны триггеров со всеми связями. Вы можете переопределить код SQL, генерируемый ERwin, адаптируя эти шаблоны для своей ситуации. См. в этой главе разд. “Изменение режима RI-триггера для связи” и “Переопределение RI-триггеров, устанавливаемых по умолчанию” об изменении поведения триггеров, устанавливаемых по умолчанию. RI-триггеры и типы связей Шаблоны RI-триггеров в ER win связываются с сущностями, исходя из типа связи и роли сущности в этой связи. Тип связи и роль сущности определяют, какое правило ссылочной целостности будет, по умолчанию, усилено присвоенным шаблоном триггера. Тип связи может быть: идентифицирующая, неидентифицирующая (nulls allowed), неидентифицирующая (no nulls), связь подтипа. Роль сущности в связи может быть - родительская (Parent) или дочерняя (Child) сущность. Если сущность является родительской в данной связи, то ER win присваивает ей шаблон триггера для родительской сущности. Если сущность является дочерней в данной связи, то ERwin присваивает ей шаблон триггера для дочерней сущности. Код триггера, который генерируется шаблоном триггера для родительской сущности, указывает СУБД, что нужно делать при вставке, изменении или удалении строки в родительской таблице связи. Код триггера, который генерируется шаблоном триггера для дочерней сущности, указывает СУБД, что нужно делать при вставке, изменении или удалении строки в дочерней таблице связи. Ниже приводится таблица, в которой описано, как ER win присваивает связи правила ссылочной целостности. Например, по умолчанию для триггера Parent Delete для идентифицирующей связи устанавливается правило RESTRICT. Это правило указывает СУБД, что нужно запретить требуемое изменение данных. Роль сущности | Тип связи | Шаблон RI-триггера | Идентифици-рующая связь | Неидентифи-цирующая (nulls allowed) | Неидентифи-цирующая (no nulls) | Cвязь подтипа | Child Delete | None | None | None | None | Child Insert | Restrict | Set Null | Restrict | Restrict | Child Update | Restrict | Set Null | Restrict | Cascade | Parent Delete | Restrict | Set Null | Restrict | Cascade | Parent Insert | None | None | None | None | Parent Update | Restrict | Set Null | Restrict | Cascade | С одной сущностью можно связать до шести шаблонов RI-триггеров, в зависимости от ее роли в разных связях. Если сущность является в какой-то связи родительской, то с ней можно связать триггеры parent insert, update и delete. Если сущность является в какой-то связи дочерней, то с ней можно связать триггеры сhild insert, update и delete. Изменение режима RI-триггера для связи Редактор Referential Integrity позволяет Вам изменять правило ссылочной целостности, связанное с конкретной связью. Например, со связью между MOVIE и MOVIE-COPY по умолчанию для случая Parent-Delete устанавливается правило ссылочной целостности RESTRICT. Вы можете изменить правило ссылочной целостности для этой связи на CASCADE, нажав кнопку CASCADE в редакторе Referential Integrity. Как изменить режим RI-триггера для связи 1. Щелкните по линии связи на диаграмме для того, чтобы выбрать эту связь. 2. Щелкните правой кнопкой мыши и дайте команду pop-up меню Editor “Referential Integrity” для входа в редактор Referential Integrity. 3. Выберите триггер, который Вы хотите изменить, из списка Trigger Action Type. 4. Нажмите на кнопку Referential Integrity Option, соответствующую режиму, который Вы хотите задать для выбранной связи. Кнопки находятся в групповом окне Referential Integrity. 5. Нажмите “ОК” для выхода из диалога в диаграмму. Работа в редакторе Trigger Template Редактор Trigger Template позволяет Вам изменять шаблон, связанный с любым типом RI-триггера, а также просматривать и модифицировать макрокод, используемый конкретным шаблоном. Когда Вы изменяете шаблон триггера, Вы можете использовать другой встроенный шаблон или пользовательский (User Override - переопределеный пользователем) шаблон. Как войти в редактор Trigger Template 1. Дайте команду меню Server “<DB> Trigger Template...”. ERwin открывает редактор и поазывает на экране встроенные и пользовательские шаблоны триггеров, связанных с сущностями диаграммы. ИЛИ установите курсор на сущность, нажмите правую кнопку мыши для входа в pop-up меню Editor и дайте команду “<DB> Trigger”. ERwin откроет окно Trigger Code Viewer, предназначенное только для чтения. Нажмите кнопку “<DB> Trigger Template...” для входа в редактор Trigger Template. Как просмотреть макрокод шаблона триггера 1. Войдите в редактор Trigger Template. Выберите шаблон триггера, который Вы хотите просмотреть, из списка “Built-In Trigger Template” или из списка “User Override”. 2. Используйте имеющиеся scroll bar для просмотра кода в окне Template Code. Чтобы увидеть большее количество кода, передвиньте границу в горизонтальной или вертикальной плоскости или нажмите кнопку Maximize в углу окна. Использование Trigger Toolbox и макрокоманд Редактор Trigger Toolbox предоставляет в Ваше распоряжение набор предопределенных макрокоманд, которые помогут Вам адаптировать встроенные шаблоны триггеров, создавать переопределенные шаблоны триггеров или писать новые триггеры и хранимые процедуры на SQL. Предопределенные макрокоманды, которые начинаются с символа процента (%), генерируют псевдокод, который в процессе генерации схемы расширяется в специальный синтаксис SQL, поддерживаемый Вашей СУБД. Trigger Toolbox состоит из трех частей: слева - набор из трех окон макрокоманд, в центре - окно, в которое выводится подсказка о выбранной макрокоманде, справа - статическая диаграмма-пример. Макрокоманды, относящиеся к сущностям, связям и атрибутам, содержатся в трех разных списках, что позволяет Вам быстрее найти нужную макрокоманду. Обратите внимание на то, что некоторые макрокоманды содержатся более чем в одном списке. Если Вы щелкнете по имени макрокоманды и выделите ее, то ER win выведет на экран, в центральное окно, вспомогательную информацию о выделенной макрокоманде. Эта вспомогательная информация включает в себя примеры, в которых использованы имена таблиц и полей из диаграммы-примера MOVIES.ER1. Более подробная информация по всем макрокомандам содержится в конце этой главы в специальных таблицах . Если при редактировании макрокода в окне Template Code Вы войдете в редактор Trigger Toolbox и дважды щелкнете по имени макрокоманды, то ER win вставит макрокоманду в то место окна кода, где стоял Ваш курсор в последний раз. При редактировании макрокода в окне Template Code Вы можете пользоваться стрелками, пробелом, Backspace, Insert, Delete и другими стандартными клавишами редактирования текста, как в Windows. Как войти в редактор Trigger Toolbox 1. Дайте команду меню Server “<DB> Trigger Template...” для входа в редактор Trigger Тemplate, а затем нажмите кнопку “Trigger Toolbox” для входа в редактор Trigger Toolbox. ИЛИ Установите курсор на сущность, нажмите правую кнопку мыши для входа в pop-up меню Editor и дайте команду “<DB> Trigger”. Когда ERwin откроет окно Trigger Code Viewer, предназначенное только для чтения, нажмите кнопку “<DB> Entity Trigger...” или кнопку “<DB> Trigger Template...” для входа в один из редакторов шаблонов, а затем нажмите кнопку “Trigger Toolbox” для входа в редактор Trigger Toolbox. Как вставить макрокоманду в окно кода шаблона 1. Находясь в любом из редакторов шаблона триггера или хранимой процедуры, установите курсор в то место, в которое Вы хотите вставить макрокоманду, и щелкните кнопкой мыши, чтобы указать точку, в которую будет вставлена макрокоманда. 2. Нажмите кнопку “Trigger Toolbox” для входа в редактор Trigger Toolbox. 3. Прокручивая соответствующий список макрокоманд, найдите ту макрокоманду, которую Вы хотите вставить, и щелкните по ней. ER win вставляет макрокоманду в ту точку в окне кода шаблона, в которой был установлен Ваш курсор перед входом в Trigger Toolbox. 4. Нажмите кнопку “Close” в редакторе Trigger Toolbox для выхода из Toolbox в редактор шаблона. Как изменить шаблон,связанный с RI-триггером 1. Выделите тип RI-триггера, который Вы хотите изменить, в списке, который находится в верхней части редактора Trigger Template. 2. Нажмите кнопку “Detach ->“, чтобы отсоединить тот шаблон, который в настоящий момент связан с выбранным RI-триггером. 3. Прокручивая список “Built-In Template” или “User Override”, найдите шаблон, который Вы хотите связать с выбранным RI-триггером. Выделите имя шаблона, щелкнув по нему, а затем нажмите кнопку “Attach” прямо над списком. ER win свяжет выбранный шаблон с триггером и покажет новую комбинацию в окне-списке, который находится в верхней части редактора Trigger Template. Если Вы передумали, Вы можете снова связать исходный встроенный шаблон триггера с выбранным типом RI-триггера. Для этого выделите тип тригера в списке и нажмите кнопку “<- Rebind”. Как создать свой шаблон триггера 1. Войдите в редактор Trigger Тemplate и выберите встроенный шаблон, который Вы будете настраивать. 2. Отредактируйте выбранный шаблон в окне Template Code, используя для этого макрокоманды ER win и стандартные клавиши, применяемые при редактировании. 3. Закончив редактировать код шаблона, щелкните по окну “Template Name” и введите новое имя для шаблона. 4. Нажмите кнопку “<- Add”, чтобы добавить новый шаблон в список “User Override”. 5. Нажмите кнопку “Close” для выхода из редактора шаблона в диаграмму. Как удалить созданный Вами шаблон 1. Войдите в редактор Trigger Template и выберите шаблон, который Вы будете удалять, в списке “User Override”, т.е. в списке шаблонов, созданных пользователями ER win. 2. Нажмите кнопку “Delete ->“ для удаления шаблона. 3. Нажмите кнопку “Close” для выхода из редактора шаблона в диаграмму. Вы можете удалять шаблоны, созданные Вами или кем-то еще. Но Вы не можете удалить шаблоны, поставляемые в составе ERwin. Переопределение шаблонов триггеров в ER win При генерации физической схемы базы данных ER win по умолчанию использует для генерации кода триггера на языке SQL встроенные шаблоны RI-триггеров, которые автоматически присваиваются каждой связи. Поскольку с каждым типом правила ссылочной целостности связан какой-то встроенный шаблон, Вы можете сгенерировать код триггера для всей Вашей модели и больше в этом отношении ничего не делать. Если Вы используете шаблоны, присваиваемые ERwin по умолчанию, то ERwin составляет коды триггера по умолчанию, используя фиксированную внутреннюю схему для комбинирования различных встроенных шаблонов. Если Вы хотите изменить коды триггера, генерируемые на основе встроенных шаблонов, ER win позволяет Вам изменить шаблон и указать, что при генерации модифицированная версия должна заменить встроенный шаблон. ERwin позволяет переопределить триггер, устанавливаемый по умолчанию, тремя способами. 1. RI Type Override - Переопределение типа RI. Для каждой комбинации правил ссылочной целостности (например Parent-Delete RESTRICT) ERwin позволяет Вам создать переопределенный шаблон и использовать этот шаблон вместо шаблона, используемого по умолчанию, для всех связей диаграммы, которым был присвоен этот тип правила ссылочной целостности. Используя в качестве отправного пункта встроенный код шаблона, Вы можете, пользуясь этим способом, производить глобальные изменения в отношении ссылочной целостности, изменяя коды триггера только в одном месте. Шаблоны RI Type Override используются вместо стандартных шаблонов ERwin, если при генерации схемы Вы задаете режим RI Type Override. 2. Relationship Override - Переопределение связи. Если Вы хотите переопределить шаблон, задаваемый по умолчанию, для какой-то конкретной связи, Вы можете модифицировать встроенный шаблон и связать новую версию только в этой связью. Например, если связь между сущностями MOVIE и MOVIE-COPY задана для Parent-Delete RESTRICT, а Вы хотите изменить поведение для этой связи, то Вы можете создать шаблон триггера Relationship Override для комбинации Parent-Delete RESTRICT и связать новый шаблон со связью MOVIE-MOVIE-COPY. Шаблоны Relationship Override используются вместо стандартных шаблонов ERwin (а также вместо шаблонов RI Type Override, если они есть), если при генерации схемы Вы задаете режим Relationship Override. 3. Entity Override - Переопределение сущности. ERwin позволяет Вам также создавать собственные триггеры Entity Override для любой сущности в диаграмме. Шаблоны Entity Override используются вместо стандартных шаблонов ERwin, а также вместо созданных Вами шаблонов RI Type Override и Relationship Override, если при генерации схемы Вы задаете режим Entity Override. Ниже приводится пирамида, показывающая, в каком порядке шаблоны триггеров ER win переопределяют друг друга. При переходе к шаблону более высокого уровня он заменяет собой шаблоны всех низших уровней. Процедура создания каждого типа переопределяющего шаблона описывается ниже. Примеры, приводимые в этой части, основаны на четырех сущностях из диаграммы CUSTOMER.ER1: Cоздание шаблона RI Type Override Шаблон RI Type Override используется для изменения поведения встроенного шаблона для типа RI-триггера. Предположим, например, что Вы хотите, чтобы ERwin всякий раз, когда Вы удаляете строку в родительской таблице ORDER, использовал код триггера Parent-Delete CASCADE, присваиваемый по умолчанию, для удаления соответствующих дочерних срок в таблице Order Line, но при этом Вы хотите также автоматически захватывать удаляемую информацию и вставлять удаляемые строки в архивную таблицу, так чтобы эту информацию потом при желании можно было найти. Один из способов, как можно это сделать - изменить встроенный триггер Parent-Delete CASCADE так, чтобы он производил архивирование, создавая RI Type Override. Имеется несколько достоинств этого способа: · К триггеру требуется добавить только пару строк кода; · изменение производится только в одном месте; · оно распространяется на всю базу данных; · оно не отражается на исходном коде приложений; · если Вы решите больше не архивировать эту информацию, то можно будет быстро восстановить исходный встроенный шаблон Parent-Delete CASCADE. Создание шаблона RI Type Override облегчает создание собственных триггеров ссылочной целостности, поскольку все связи, которым присваивается переопределенный тип RI-триггера, автоматически используют связанный с ним шаблон User Override. Как создать шаблон RI Type Override 1. Войдите в редактор Trigger Template и выберите шаблон, который Вы хотите изменить, из списка “Built-in Trigger Template”, так что код шаблона для этого триггера появится в окне Template Code. 2. Измените исходное имя “Template Name” на “говорящее” имя шаблона, который Вы создаете, например “Archive Deleted Data”. 3. Войдите в окно Template Code и измените код шаблона так, чтобы он удовлетворял Вашим требованиям. Например, Вы можете добавить к шаблону новые коды, которые будут автоматически вставлять строку в архивную таблицу каждый раз, когда активизируется этот триггер. Вы можете использовать макрокоманды из Trigger Toolbox, чтобы ускорить процесс написания кода. 4. Закончив редактирование кода, нажмите кнопку “Add”, чтобы добавить Ваш шаблон в список “User Override”. 5. Чтобы присвоить новый шаблон в качестве переопределяющего шаблона, выделите Ваш шаблон, а также встроенный шаблон, который Вы хотите переопределить, а затем нажмите кнопку “Attach”, которая находится над списком “User Override”. ER win заменит встроенный шаблон новым и покажет тип триггера и связанный с ним шаблон в списке наверху редактора Trigger Template. 6. Нажмите кнопку “Close” для выхода из редактора в диаграмму. 7. Чтобы ER win мог использовать шаблоны RI Type Override вместо встроенных, включите режим “RI Type Override” в редакторе Schema Generation Report, когда Вы будете генерировать физическую схему базы данных. Создание шаблона триггера Relationship Override Чтобы облегчить работу с базой данных, мы рекомендуем Вам попытаться сделать так, чтобы Ваши триггеры работали идентично на всей модели данных. Однако в некоторых случаях Вам может понадобиться изменить встроенный триггер только для одной связи. Шаблон Relationship Override используется для изменения поведения встроенного шаблона только для одной связи, а не для всех связей, для которых задан некоторый тип триггера. Например, Вы можете захотеть, чтобы ER win использовал код триггера, установленный по умолчанию, - Parent-Delete RESTRICT - всякий раз при удалении строки из родительской таблицы ORDER, чтобы проверить, нет ли в этом заказе невыполненных пунктов. Если часть заказа не выполнена, то Вы, наверное, захотите использовать код триггера, устанавливаемого по умолчанию, который запрещает Вам удалять заказ. Предположим, однако, что в данной ситуации Вы хотите также, чтобы триггер ссылочной целостности автоматически изменил значение в колонке Order-Status на “Outstanding”. Если Вы изменяете встроенный триггер так, чтобы он мог выполнить это действие, создавая для этого Relationship Override для триггера Parent-Delete RESTRICT, то этот шаблон будет применяться только к связи между таблицами ORDER и ORDER LINE. Хотя изменение режимов ссылочной целостности для отдельных связей может усложнить работу с базой данных, использование режима Relationship Override позволяет вам поддерживать правила, которые распространяются на какие-то отдельные связи. Режим Relationship Override изменяет действие RI-триггера для одной конкретной связи. Как создать шаблон Relationship Override Trigger 1. Щелкните по линии связи, для которой Вы хотите создать новый триггер, нажмите правую кнопку мыши для входа в pop-up меню Editor и дайте команду “Relationship Template” для входа в редактор Relationship Trigger Template. 2. Выберите шаблон, который Вы хотите изменить, из списка “Built-in Trigger Template”, так что код шаблона для этого триггера появится в окне Template Code. 3. Измените исходное имя “Template Name” на “говорящее” имя Вашего шаблона, например - “Outstanding Orders”. 4. Откройте окно Template Code и измените код шаблона так, чтобы он удовлетворял Вашим требованиям. Например, Вы можете добавить в шаблон новый код, который будет автоматически изменять значение в строке вместо того, чтобы удалять эту строку. Вы можете использовать макрокоманды из Trigger Toolbox, чтобы ускорить процесс написания кодов, и просмотреть расширенный код в окне Expan ded Code. 5. Закончив редактирование кода, нажмите кнопку “Add”, чтобы добавить Ваш шаблон в список “User Override”. 6. Чтобы присвоить новый шаблон в качестве переопределяющего, выделите Ваш шаблон, а также встроенный шаблон, который Вы хотите переопределить, а затем нажмите кнопку “Attach”, расположенную над списком “User Override”. ER win заменяет встроенный шаблон новым и показывает тип триггера и связанный с ним новый шаблон в списке, расположенном наверху в редакторе Trigger Template. 7. Нажмите кнопку “Close” для выхода из редактора в диаграмму. 8. Чтобы ER win начал использовать шаблоны RI Type Override вместо встроенных, включите режим “Relationship Override” в редакторе Schema Generation Report, когда Вы будете генерировать физическую схему базы данных. Ниже приводится часть кода шаблона Relationship Override для триггера Parent-Delete RESTRICT (вверху), расширенный код (в центре) и завершенный шаблон триггера (внизу). /* ERwin Built-in %Datetime */ /* %Parent %VerbPhrase %Child ON PARENT DELETE RESTRICT */ update %Parent set order_status=‘outstanding’ from %Parent, deleted, %Child where /* %%JoinPKPK(%Parent, deleted) */ %JoinPKPK(%Parent,deleted) and /*%%JoinFKPK(%Child,deleted) */ %JoinFKPK(%Child,deleted) /* ERwin Built-in Mon Apr 5 07:52:30 1993 */ /*ORDER contains ORDER_LINE ON PARENT DELETE RESTRICT */ update ORDER set order_status=‘outstanding’ from ORDER,deleted,ORDER_LINE where /*%JoinPKPK(ORDER,deleted) */ ORDER.order_id = deleted.order_id and /*JoinFKPK(ORDER_LINE,deleted) */ ORDER_LINE.order_id = deleted.order_id create trigger tD_ORDER on ORDER for DELETE as /* ERwin Builtin Mon Apr 5 07:49:49 1993 */ /* DELETE trigger on ORDER */ begin declare @errno int, @errmsg varchar(255) /* ERwin Builtin Mon Apr 5 07:49:49 1993 */ /* ORDER contains ORDER_LINE ON PARENT DELETE RESTRICT */ update ORDER set order_status=‘outstanding’ from ORDER,deleted,ORDER_LINE where /*%JoinPKPK(ORDER,deleted) */ ORDER.order_id = deleted.order_id and /* JoinFKPK(ORDER_LINE,deleted) */ ORDER_LINE.order_id = deleted.order_id /* ERwin Builtin Mon Apr 5 07:49:49 1993 */ return error: raiserror @errno @errmsg rollback transaction end go Рис. 16.13. Код шаблона для Relationship Override для связи ORDER-ORDER_LINE, использующего триггер Parent-Delete RESTRICT. Создание триггера Entity Override Во многих случаях бывает нужно, чтобы триггер выполнял действия. выходящие за рамки стандартных действий по усилению правил RI, например, производил вычисления, работал с колонкой, содержащей выведенные значения, или изменял содержимое колонки, исходя из текущего значения этой колонки. Эти триггеры расширенных правил business rule можно применить к связи или к сущности. Если Вы хотите усилить каие-то правила для отдельных сущностей, ER win позволяет Вам изменить поведение встроенного триггера для отдельной сущности. Шаблон Entity Override используется для изменения поведения встроенного шаблона по отношению только к одной сущности. Предположим, например, что Вы хотите, чтобы ER win каждый раз при добавлении новой строки в таблицу ORDER LINE добавлял количество заказанного товара order-quantity из таблицы ORDER LINE к количеству проданного товара product-sold-quantity в таблице PRODUCT. Этого можно добиться, создав триггер Entity Override для сущности ORDER LINE, который изменяет действия, выполняемые встроенным шаблоном Child-Insert RESTRICT. Entity Override изменяет поведение триггера для какой-то одной сущности. Как создать шаблон Entity Override 1. Щелкните по сущности, для которой Вы хотите создать новый триггер, нажмите правую кнопку мыши для входа в pop-up меню Editor и дайте команду “<DB> Trigger” для входа в окно Trigger Code Viewer, предназначенное только для чтения. Нажмите кнопку “<DB> Entity Trigger Template...” для входа в редактор Entity Тrigger Template. 2. Щелкните по окну “Trigger” и введите “говорящее” имя нового шаблона триггера сущности, например “special order-line insert”. Нажмите кнопку “New” и добавьте новый шаблон в список шаблонов триггеров сущности. 3. Щелкните по одному из окон check box “Trigger On”, чтобы указать, хотите ли Вы создать собственный триггер для Insert, Update или Delete. Когда Вы ставите метку в одно из этих окон, ERwin автоматически загружает код встроенного шаблона в окна кодов, которые расположены в нижней части редактора. 4. Щелкните по окну Template Code и измените код шаблона так, чтобы он удовлетворял Вашим требованиям. Например, Вы можете добавить в шаблон новый код, который будет автоматически изменять значение в строке вместо того, чтобы удалять эту строку. Вы можете использовать макрокоманды из Trigger Toolbox, чтобы ускорить процесс написания кодов. Чтобы просмотреть расширенный код, щелкните по окну Expanded Code и используйте scroll bars, рамку окна и (или) кнопку Maximize, чтобы увеличить размер окна. 5. Нажмите кнопку “ОК” для выхода из редактора в диаграмму. 8. Чтобы ER win начал использовать шаблоны Entity Override вместо встроенных, включите режим “Entity Override” в редакторе Schema Generation Report, когда Вы будете генерировать физическую схему базы данных. Вы можете создать отдельные триггеры Entity Override для действий Insert, Update и Delete, или скомбинировать разные действия в одном триггере. Если Вы хотите скомбинировать действия, поставьте метку в каждом применимом к Вашему случаю окне “Trigger On”. Например, если Вы хотите расширить Ваш триггер Entity Override “special order-line insert” таким образом, чтобы он вычислял значение product-sold-quantity при изменении и удалении строки из ORDER LINE точно так же, как при добавлении строки, поставьте метки в окна Update, Insert и Delete и измените код шаблона так, чтобы он обрабатывал случаи изменения и удаления строк, вычисляя значение product-sold-quantity для этих случаев. Если Вы создаете свои триггеры для сущностей и связываете их с конкретными сущностями, ERwin не может использовать свою стандартную схему для комбинирования разных встроенных шаблонов. Вы должны взять на себя написание кода, который контролирует, каким образом комбинируются шаблоны для этих сущностей. Чтобы помочь Вам, ERwin предоставляет в Ваше распоряжение набор специальных управляющих макрокоманд, включая макрокоманды, которые просматривают все связи в поисках заданной сущности. Пример триггера Ent ity Override Ниже приводится исходный код шаблона для создания триггера Entity Override Child-Insert для сущности ORDER-LINE. Новый код, используемый для добавления order-quantity к prooduct-sold-quantity, вставляется сразу же после выражения %ForEachChildRel, поскольку сущность ORDER-LINE является дочерней в связи между ORDER-LINE и PRODUCT. Вставляемый код приводится ниже. сreate trigger %TriggerName on %TableName for %Actions(“,”) as /* %Actions(“,”) trigger on %TableName */ /* default body for %Trigg erName */ begin declare @numrows int, @nullcnt int, @validcnt int, %PKDecl(,@ins), @errno int, @errmsg varchar(255) select @numrows = @@rowcount %ForEachChildRel(){ %RelTemplate } %ForEachParentRel(){ %RelTemplate } return error: raiserror @errno @errmsg rollback transaction end go Рис. 16.15. Код измененного шаблона, включающий в себя специальный код (он выделен), нужный для того, чтобы изменять значение product-sold-quantity в таблице PRODUCT каждый раз при добавлении новой строки в таблицу ORDER LINE, показан ниже. Для того чтобы просмотреть расширенный код после того, как шаблон, заданный по умолчанию, изменен, щелкните по окну Expanded Code. сreate trigger %TriggerName on %TableName for %Actions(“,”) as /* %Actions(“,”) trigger on %TableName */ /* default body for %TriggerName */ begin declare @numrows int, @nullcnt int, @validcnt int, %PKDecl(,@ins), @errno int, @errms g varchar(255) select @numrows = @@rowcount %ForEachChildRel(){ %RelTemplate %if (%==(%VerbPhrase,is requested on)){ update %Parent from %Parent,inserted set product-sold-quantity = %Parent.product-sold-quantity +inserted.order-quantity where %JoinFKPK(inserted,%Parent) } } %ForEachParentRel(){ %RelTemplate } return error: raiserror @errno @errmsg rollback transaction end go Рис. 16.16 Далее приводится расширенный код триггера, где Вы можете увидеть реальные значения, которые заменили макропеременные, использованные в коде шаблона. Обратите внимание, что специальный код, изменяющий таблицу PRODUCT, дублируется в каждом триггере Child-Insert, связанном с сущностью ORDER-LINE. create trigger special order-line insert on ORDER_LINE for INSERT as /* INSERT trigger on ORDER_LINE */ /* default body for special order-line insert */ begin declare @numrows int, @nullcnt int, @validcnt int, @ins_order_line_number CHAR(18), @ins_order_id CHAR(18), @errno int, @errmsg varchar(255) select @numrows = @@rowcount /* ERwin Builtin Fri Apr 02 09:42:42 1993 */ /*ORDER contains ORDER_LINE ON CHILD INSERT RESTRICT */ if /*%ChildFK(“or”,update) */ update(order_id) begin select @nullcnt = 0 select @validcnt = count(*) from inserted,ORDER where /*JoinFKPK(inserted,ORDER) */ inserted.order_id = ORDER.order_id /*NotnullFK(inserted,”is null”,”select @nullcnt = count(*) from inserted where”,” or”) */ if @validcnt + @nullcnt != @numrows begin select @errno = 30002, @errmsg = ‘Cannot INSERT “ORDER_LINE” because “ORDER” does not exist”. goto error end end /* ERwin Builtin Fri Apr 02 09:42:42 1993 */ /*PRODUCT is requested on ORDER_LINE ON CHILD INSERT RESTRICT */ if /* %ChildFK(“or”,update) */ update(product_model_number) begin select @nullcnt = 0 select @validcnt = count(*) from inserted,PRODUCT where /*%JoinFKPK(inserted,PRODUCT) */ inserted.product_model_number = PRODUCT.product_model_number /*%NotnullFK(inserted,”is null”,select @nullcnt = count(*) from inserted where”,” or”) */ select @nullcnt = count(*) from inserted where inserted.product_model_number is null if @validcnt + @nullcnt != @numrows begin select @errno = 30002, @errmsg = ‘Cannot INSERT “ORDER_LINE” because “PRODUCT” does not exist’. goto error end end update PRODUCT from PRODUCT,inserted set product-sold-quantity=PRODUCT.product-sold-quantity + inserted.order-quantity where inserted.product_model_number= PRODUCT.product_model_number return error: raiserror @errno @errmsg rollback transaction end go Рис. 16.17. Расширенный код триггера для “special ORDER_LINE INSERT”. Использование хранимых процедур Хранимой процедурой называется блок кода SQL, подобный триггеру, который хранится на сервере для быстрого выполнения. Хранимая процедура напоминает триггер, с той разницей, что она не откликается на какое-то событие, как RI-тригер. Вместо этого она вызывается из другой программы, которая передает на сервер имя процедуры. Хранимая процедура более гибка, чем триггер, поскольку ей можно передавать параметры и она может возвращать параметры, значения и сообщения. а также вызывать другие хранимые процедуры. Например, для фирмы проката видеопродукции Вы можете создать хранимую процедуру, которая будет автоматически выбирать все фильмы, срок аренды которых истек какого-то числа. Это число будет параметром, который передается процедуре в режиме run-time. Затем эта хранимая процедура может вызывать другую хранимую процедуру, вычисляющая пени за каждый задержанный фильм, исходя из типа фильма и правил (business rules). Во многих отношениях создание хранимой процедуры в ERwin аналогично созданию триггера. При создании хранимой процедуры Вы можете использовать Trigger Toolbox и предопределенные макрокоманды ERwin, чтобы вставить нужный Вам код в окно Template Code. После того как код шаблона для хранимой процедуры написан, ее можно свящать с отдельной сущностью или со всей схемой. Когда Вы создаете в физической схеме бахы данных таблицу, связанную с сущностью, ERwin автоматически расширяет код шаблона и создает все связанные с ним хранимые процедуры с соблюдением синтаксиса SQL для Вашей СУБД точно так же, как он создает триггеры, связанные с сущностями и связями ERwin. Существует, однако, одно важное отличие между созданием хранимой процедуры и RI-триггера. В отличие от RI-триггера, который реагирует на определенное изменение данных в таблице, хранимая процедура может выполнять практически любой тип действий. Эта гибкость является причиной того, что Вы должны задавать шаблон хранимой процедуры с нуля. Не существует встроенных шаблонов хранимых процедур, которые можно было бы использовать как отправной пункт при создании новой хранимой процедуры. Если Вы знакомы с SQL и знаете синтаксис Вашей СУБД, Вы можете вводить выражения SQL непосредственно в окна редакторов шаблонов ER win. Если Вы вводите код SQL для хранимых процедур в ERwin, то Вы можете использовать возможности просмотра и генерации отчетов в ERwin для того, чтобы просмотреть все процедуры, связанные со схемой, а также те, которые связаны с отдельными сущностями. Задавая хранимые процедуры в ERwin, Вы получаете возможность управлять этой информацией в одной среде, так что Вы легко можете изменять ссылки на схему в кодах шаблона процедуры. Создание хранимой процедуры Для того чтобы приступить к созданию хранимой процедуры, дайте команду “<DB> Table Property”, а затем - команду каскадного меню “Stored Procedure”. Вы войдете в редактор Table Property. Редактор Table Property позволяет Вам просматривать все хранимые процедуры, физические характеристики и правила валидации, связанные с таблицей базы данных. Если Ваша СУБД поддерживает хранимые процедуры, то внизу редактора появляется закладка Stored Procedure, а также появляется лист связей хранимых процедур Stored Procedure Attachment Sheet. Если Ваша СУБД не поддерживает хранимые процедуры, то закладка Stored Procedure не появляется. См. документацию по Вашей СУБД о том, поддерживает ли она хранимые процедуры. Лист связей хранимых процедур - Stored Procedure Attachment Sheet редактора Table Property содержит информацию о том, какая таблица связана с каждой из сущностей ERwin и какие хранимые процедуры в настоящий момент связаны с каждой из сущностей и таблиц. В этом редакторе Вы можете просмотреть код шаблона каждой из хранимых процедур, а также связать хранимую процедуру с определенной сущностью или отсоединить ее от сущности. Для того чтобы связать процедуру с сущностью, выберите сущность из списка “Entity”, а затем выделите имя шаблона процедуры, которую Вы хотите связать с сущностью, и нажмите кнопку “A ttach”. Для того чтобы создать шаблон для новой процедуры, нажмите кнопку “SP Template...” для входа в редактор Stored Procedure Template. Работа в редакторе Stored Procedure Template Редактор Stored Procedure Template позволяет Вам создавать, изменять или удалять хранимую процедуру. Список “Template Name”, расположенный в верхней части редактора, содержит имена всех хранимых процедур, связанных с выбранной Вами сущностью. Для того чтобы изменить существующую хранимую процедуру, щелкните по имени шаблона, который Вы хотите изменить, в списке “Template Name”. Когда ERwin поккажет на экране код, щелкните по окну Template Code и измените коды, пользуясь встроенными макрокомандами и стандартными клавишами редактирования. Нажмите кнопку “Update” для сохранения изменений. Для того чтобы удалить ранее определенную процедуру, щелкните по имени удаляемого шаблона в списке “Template Name”, а затем нажмите кнопку “Delete”. Для того чтобы создать новую хранимую процедуру, нажмите кнопку “New” и введите “говорящее” имя, например “sp_overdue” для хранимой процедуры, выбирающей все просроченные фильмы на сегодняшнее число. После этого установите курсор в окно Template Code и создайте код шаблона, пользуясь встроенными макрокомандами и клавишами редактирования. Заккончив создание кода шаблона, нажмите “ОК” для выхода из текущего редактора в редактор Table Property, в котором Вы можете связать новый шаблон с одной или несколькими сущностями. Как создать хранимую процедуру 1. Щелкните правой кнопкой мыши по сущности, дайте команду “<DB> Table Property”, затем дайте команду каскадного меню “Stored Procedure” для входа в редактор Table Property. 2. Нажмите кнопку “SP Template” на листе связей хранимых процедур (Stored Procedure Attachment Sheet) в редакторе Table Property для входа в редактор Stored Procedure Template. 3. Введите “говорящее” имя процедуры в окно “Name” и нажмите кнопку “New”, чтобы начать создание определения новой хранимой процедуры. 4. Щелкните по окну Template Code и введите макрокод, используя встроенные макрокоманды и стандартные клавиши редактирования текста. Если Вы знаете синтаксис языка СУБД, установленной в настоящий момент, то Вы можете вводить выражения SQL непосредственно в окно Template Code. Если Вы хотите, чтобы ER win автоматически связал шаблон хранимой процедуры с каждой новой сущностью, которую Вы будете создавать, поставьте метку в окне “Attach to New Entities” перед выходом из редактора шаблонов. 5. Нажмите “ОК” для выхода из редактора шаблонов в редактор Table Properties. Как изменить хранимую процедуру 1. Войдите в редактор Stored Procedure Template. 2. Щелкните по имени шаблона, который Вы хотите изменить, в списке “Template Name” наверху редактора. 3. Щелкните по окну Template Code и отредактируйте макрокод, используя встроенные макрокоманды и стандартные клавиши редактирования текста. Если Вы знаете синтаксис языка СУБД, установленной в настоящий момент, то Вы можете вводить выражения SQL непосредственно в окно Template Code. 4. Нажмите кнопку “Update” для сохранения изменений. 5. Нажмите “ОК” для выхода из редактора шаблонов в редактор Table Property. Как удалить хранимую процедуру 1. Войдите в редактор Stored Procedure Template. 2. Щелкните по имени шаблона, который Вы хотите удалить, в списке “Template Name” наверху редактора. 4. Нажмите кнопку “Delete” для удаления шаблона. 5. Нажмите “ОК” для выхода из редактора шаблонов в редактор Table Property. Cвязывание хранимых процедур с сущностями Лист связей хранимых процедур (Stored Procedure Attachment Sheet) редактора Table Property позволяет Вам связыывать хранимые процедуры с сущностями ER win и соответствующими таблицами базы данных. Два списка в верхней части листа позволяют Вам выбрать сущность или соответствующую ей таблицу, с которой Вы хотите связать хранимую процедуру. Список “Attached Template” содержит все процедуры, связанные с выбранной сущностью или таблицей. Список “Un-Attached Template” содержит все шаблоны хранимых процедур, который не связаны с выбранной сущностью. Для того чтобы связать шаблон хранимой процедуры с сущностью, выберите сущность, затем выделите имя шаблона процедуры, которую Вы хотите связать с этой сущностью, из списка “Un-Attached Template” и нажмите кнопку “Attach”. Для того чтобы отменить связь между шаблоном хранимой процедуры и сущностью, выберите сущность, затем выделите имя шаблона процедуры, для которой Вы хотите отменить связь с этой сущностью, из списка “Attached Template” и нажмите кнопку “Detach”. Для того чтобы просмотреть список всех сущностей, связанных с каким-то шаблоном хранимой процедуры, выделите имя шаблона и нажмите кнопку “SP Browser...”. Как связать с сущностью хранимую процедуру 1. Прокручивая список сущностей в окне “Entity”, найдите сущность, с которой Вы хотите связать хранимую процедуру, и щелкните по ней. ER win автоматически выделяет соответствующую таблицу базы данных. 2. Выделите имя шаблона хранимой процедуры, который Вы хотите связать с данной сущностью, в списке “Un-Attached Templates”. 3. Нажмите кнопку “Attach”, чтобы связать шаблон с сущностью. Как отсоединить от сущности хранимую процедуру 1. Прокручивая список сущностей в окне “Entity”, найдите сущность, от которой Вы хотите отсоединить хранимую процедуру, и щелкните по ней. ER win автоматически выделяет соответствующую таблицу базы данных. 2. Выделите имя шаблона хранимой процедуры, который Вы хотите отсоединить от данной сущности, в списке “Attached Templates”. 3. Нажмите кнопку “Detach”, чтобы отсоединить шаблон от сущности. Как связывать сущности с хранимой процедурой и отсоединять их от нее 1. Дайте команду “<DB> Table Property”, а затем - команду каскадного меню “Stored Procedure”, чтобы открыть лист Stored Procedure Attachment Sheet в редакторе Table Property. 2. Нажмите кнопку “SP Browser...”. ER win открывает Browser, в котором содержатся имена всех шаблонов хранимых процедур (список “Template Name” в верхней части окна-диалога). 3. Щелкните по шаблону процедуры в списке “Template Name”. ER win выводит список всех таблиц, которые в настоящий момент связаны с выбранной хранимой процедурой (список “Attached Table”), а также список всех таблиц, которые в настоящий момент не связаны с выбранной хранимой процедурой (список “Un-Attached Table”). 4. Для того чтобы связать таблицу с выбранным шаблоном процедуры, выделите имя таблицы, которую Вы хотите связать с данным шаблоном, в списке “Unattached Table”, а затем нажмите кнопку “Attach”. Чтобы связать с данным шаблоном все таблицы, которые с ним не связаны, нажмите кнопку “Attach All”. 5. Для того чтобы отсоединить таблицу от выбранного шаблона процедуры, выделите имя таблицы, которую Вы хотите отсоединить от данного шаблона, в списке “Аttached Table”, а затем нажмите кнопку “Detach”. Чтобы отсоединить от данного шаблона все таблицы, которые с ним связаны, нажмите кнопку “Detach All”. Cвязывание хранимых процедур со схемой ERwin позволяет Вам связывать хранимые процедуры не только с отдельными таблицами, но и со всей схемой. Чтобы облегчить управление базой данных, если Вы создали хранимую процедуру, которая выполняет административную функцию, например определяет привилегии пользователей, Вы можете связать процедуру со схемой, а не с отдельными таблицами. Для создания хранимой процедуры на уровне схемы или для связывания хранимой процедуры со схемой дайте команду меню Server “<DB> Schema Property” для входа в редактор Schema Properties. Редактор Schema Properties позволяет Вам просматривать все хранимые процедуры, а также скрипты “до и после генерации схемы”, которые связаны со схемой. Если Ваша СУБД поддерживает хранимые процедуры, то в нижней части редактора появляется закладка Stored Procedure и на экран выводится лист Stored Procedure Attachment Sheet. Если Ваша СУБД не поддерживает хранимые процедуры, то закладка Stored Procedure не появляется. О поддержке хранимых процедур в Вашей СУБД см. документацию по ней. Лист Stored Procedure Attachment Shеet редактора Schema Properties показывает, какие хранимые процедуры связаны со схемой в настоящий момент. В этом редакторе Вы можете просмотреть код шаблона любой процедуры, а также связать процедуру со схемой и отсоединить от нее. Список хранимых процедур, которые связаны в настоящий момент со схемой, приводится в окне “Attached SP Template” наверху редактора. Список хранимых процедур, которые не связаны в настоящий момент со схемой, приводится в окне “Un-attached SP Template” в центре редактора. Редактор Schema Properties позволяет Вам также просматривать код шаблона для выбранной процедуры в окне Template Code внизу редактора. Для того чтобы связать процедуру со схемой, выделите имя шаблона процедуры в списке “Un-attached SP Template” и нажмите кнопку “Attach”. Для того чтобы отсоединить процедуру от схемы, выделите имя шаблона процедуры в списке “Un-attached SP Template” и нажмите кнопку “Detach”. Для создания нового шаблона процедуры нажмите кнопку “Schema SP Template...” для входа в редактор Stored Procedure Template. Скрипты “до и после генерации схемы” Скриптами “до и после генерации схемы” (pre&post schema-generation) называются скрипты SQL, которые Вы хотите, чтобы ER win выполнил сразу же до или после генерации схемы. Например, когда Вы производите обратное проектирование базы данных из модели ERwin, Вы можете создать скрипт “до генерации схемы”, который удаляет старую базу данных и создает новую до того, как ERwin начнет генерацию таблиц и индексов, определенных в модели данных. Скрипты уровня схемы связаны со схемой таким же образом, что и хранимые процедуры. Скрипты уровня схемы определяются в редакторе Schema Script. Для входа в этот редактор войдите сначала в редактор Schema Properties и щелкните внизу этого редактора по закладке “Pr e & Post Scripts”. Как создать новую хранимую процедуру или скрипт на уровне схемы 1. Дайте команду меню Server “<DB> Schema Properties” для входа в редактор Schema Properties. 2. Щелкните по соответствующей закладке в нижней части редактора, чтобы создать хранимую процедуру или скрипт. 3. Нажмите кнопку “Templates...” в редакторе Schema Properties для входа в редактор Stored Procedure или Schema Script Template. 4. Введите “говорящее” имя процедуры или скрипта в окно “Name”, затем нажмите кнопку “New”, чтобы начать создание определения нового шаблона. 5. Щелкните по окну Template Code и введите макрокод, используя для этого макрокоманды Toolbox и стандартные клавиши редактирования текста. Если Вы знаете синтаксис языка СУБД, установленной в настоящий момент, то Вы можете вводить выражения SQL непосредственно в окно Template Code. 6. Если Вы хотите, чтобы ER win автоматически выполнил скрипт перед генерацией схемы, поставьте метку в окно “Pre script creation” в редакторе Schema Script Template. Если Вы хотите, чтобы ERwin автоматически выполнил скрипт после генерации схемы, поставьте метку в окно “Post script creation” перед выходом из редактора Schema Script Template. 7. Нажмите кнопку “ОК” для выхода из редактора в редактор Schema Properties. Как модифицировать шаблон хранимой процедуры или скрипта на уровне схемы 1. Войдите в редактор Schema Properties. Щелкните по соответствующей закладке в нижней части редактора, чтобы создать хранимую процедуру или скрипт. 2. Щелкните по имени шаблона, который Вы хотите модифицировать, в списке “Template Name” в верхней части редактора. 3. Щелкните по окну Template Code и измените макрокод шаблона, используя для этого макрокоманды Toolbox и стандартные клавиши редактирования текста. Если Вы знаете синтаксис языка СУБД, установленной в настоящий момент, то Вы можете вводить выражения SQL непосредственно в окно Template Code. 4. Нажмите кнопку “Update” для сохранения изменений. 5. Нажмите кнопку “ОК” для выхода из редактора в редактор Schema Properties. Как связывать и отсоединять хранимых процедур и скриптов уровня схемы 1. Дайте команду меню Server “<DB> Schema Properties” для входа в редактор Schema Properties. 2. Щелкните по соответствующей закладке в нижней части редактора, чтобы создать хранимую процедуру или скрипт. 3. Выделите имя шаблона, который Вы хотите связать со схемой, в списке “Un-attached Templates”. 4. Для того чтобы связать шаблон со схемой, нажмите кнопку “Attach”. Чтобы связать со схемой все шаблоны, которые с ней не связаны, нажмите кнопку “Attach All”. 5 . Для того чтобы отсоединить шаблон от схемы, выделите имя шаблона хранимой процедуры, которую Вы хотите отсоединить от схемы, в списке “Аttached Templates”, а затем нажмите кнопку “Detach”. Чтобы отсоединить от схемы все шаблоны, которые с ней связаны, нажмите кнопку “Detach All”. 6. Нажмите кнопку “ОК” для выхода из редактора в диаграмму. Генерация триггеров и хранимых процедур Когда Вы создаете физическую схему базы данных, ER win автоматически создает все триггеры и хранимые процедуры, определенные в Вашей модели данных, с соблюдением синтаксиса SQL для Вашей СУБД. Вы можете создавать RI-тригеры и хранимые процедуры, когда Вы впервые генерируете схему физической базы данных, или же Вы можете сгенерировать их отдельно, когда таблицы базы данных уже существуют. Для генерации триггеров и хранимых процедур дайте команду меню Server “<DB> Schema Generation...”. ERwin открывает редактор Schema Generation Report. Использование режимов генерации схемы применительно к триггерам и хранимым процедурам Редактор Schema Generation Report позволяет Вам выбирать объекты, которые Вы хотите влючить в физическую схему, включая RI-триггеры, хранимые процедуры, связанные со всей схемой, хранимые процедуры, связанные с сущностями и скрипты, выполняемые до (пре-скрипты) или после (пост-скрипты) того, как будет сгенерирована оставшаяся часть схемы. Для генерации группы объектов, таких как триггеры, щелкните по check box для соответствующей группы объектов, а затем включите любой из связанных с ней режимов генерации, по Вашему желанию, например User Override Trigger Template. Как генерировать RI-триггеры 1. Дайте команду меню Server “<DB> Schema Generation...” для входа в редактор Schema Generation Report. 2. Поставьте метку в check box “Trigger” в групповом окне Trigger для того, чтобы задать генерацию всех триггеров, определенных в модели данных, используя встроенные шаблоны RI-триггеров. 3. Если Вы хотите, чтобы ER win использовал переопределенные (User Override) шаблоны триггеров, а не встроенные триггеры, поставьте метку в одном или нескольких окнах User Override для включения режимов генерации триггеров: “RI Type Override”, “Relationship Override” и (или) “Entity Override”. Эти три режима переопределения можно использовать по отдельности или любую их комбинацию для достижения необходимых результатов при генерации триггеров. 4. Нажмите кнопку “Preview...” , чтобы просмотреть код SQL до того, как Вы начнете создавать триггеры. Нажмите кнопку “Generate...”, чтобы начать генерацию триггеров на сервере. Когда Вы нажимаете “Generate...” , ERwin выводит на экран окно для подсоединения к базе данных, если Вы еще к ней не подсоединены. Введите, если это нужно, информацию, необходимую для подсоединения к базе данных. 5. После того как ER win завершит генерацию всех триггеров, он выводит на экран сообщение, содержащее число созданных триггеров. Нажмите “ОК”, чтобы закрыть окно-сообщение. После этого нажмите “Close” для выхода из редактора в диаграмму. Как генерировать хранимые процедуры 1. Дайте команду меню Server “<DB> Schema Generation...” для входа в редактор Schema Generation Report. 2. Поставьте метку в check box “Schema” и “Create” в групповом окне Stored Procedure для того, чтобы cоздать все хранимые процедуры, связанные со схемой. Поставьте метку в check box “Entity” и “Create” в групповом окне Stored Procedure для того, чтобы cоздать все хранимые процедуры, связанные с сущностями. Для того чтобы выполнить скрипт, который Вы хотите запустить перед генерацией схемы, поставьте метки в check box “Pre script --Schema” и (или) “Pre script --Entity”. Для того чтобы выполнить скрипт, который Вы хотите запустить после генерации схемы, поставьте метки в check box “Post script --Schema” и (или) “Post script --Entity”. 3. Нажмите кнопку “Preview...” , чтобы просмотреть код SQL до того, как Вы начнете создавать хранимые процедуры. Нажмите кнопку “Generate...”, чтобы начать генерацию хранимых процедур на сервере. Когда Вы нажимаете “Generate...”, ER win выводит на экран окно для подсоединения к базе данных, если Вы еще к ней не подсоединены. Введите, если это нужно, информацию, необходимую для подсоединения к базе данных. 4. После того как ER win завершит генерацию всех хранимых процедур, он выводит на экран сообщение, содержащее число созданных хранимых процедур. Нажмите “ОК”, чтобы закрыть окно-сообщение. После этого нажмите “Close” для выхода из редактора в диаграмму. Как удалить из базы данных хранимые процедуры 1. Выполняйте те же действия, что и при генерации хранимых процедур, но вместо сheck box “Create” поставьте метку в check box “Drop”. Если Вы поставите метки и в “Create” и в “Drop”, то ERwin сначала удалит существующие хранимые процедуры, а затем создаст новый набор хранимых процедур. Более подробно о редакторе Schema Generation Report см. Гл.18, Прямое и обратное проектирование, разд. “Генерация схемы базы данных”. В поставку ERwin входит файл-пример SP.ER1, содержащий несколько полезных хранимых процедур. Поддержка триггеров, скриптов и хранимых процедур в различных СУБД Ниже приводится таблица, описывающая, как поддерживаются в разных СУБД триггеры, хранимые процедуры, пре- и пост-скрипты. | RI-триггеры | Хранимые проц. | Пре/пост-скрипты | СУБД SQL | DB2 | | | · | SQL Server | · | · | · | Rdb | · | · | · | ORACLE версия 6 | | | · | ORACLE версия 7 | · | · | · | SQLBase версия 5 | | | · | SQLBase версия 6 | | · | · | WATCOM версия 2 | | | · | WATCOM версия 4 | · | · | · | Ingres | · | · | · | SYBASE версия 4.2 | · | · | · | SYBASE System 10 | · | · | · | AS/400 | | | · | NetWare SQL | | | · | INFORMIX версия 5 | · | · | · | INFORMIX версия 6 | · | · | · | Progress | · | · | · | РС-ориентир.СУБД | | | · | Список макрокоманд Данная таблица содержит имена всех макрокоманд ER win, их синтаксис, описание расширенного кода, генерируемого макрокомандой и список СУБД, поддерживающих ее использование. Информация, которую Вы вводите вручную, заключена в угловые скобки (например, <macro code 1>). Вы можете использовать эти макрокоманды в шаблонах, которые Вы создаете для триггеров, хранимых процедур и скриптов (если эти возможности поддерживаются Вашей СУБД). Если в графе “СУБД” стоит слово “Все”, это означает, что любая СУБД поддерживает использование макрокоманды хотя бы в одном типе шаблонов ER win. Обратите внимание, что некоторые макрокоманды, например %Fire, позволяющие Вам задавать, когда будет выполняться триггер, зависят от возможностей, которые не поддерживаются всеми СУБД. Более подробно о том, поддерживает ли Ваша СУБД RI-триггеры, хранимые процедуры и (или) скрипты, см. документацию по этой CУБД. Макрокоманда | Описание | СУБД | %!=(<macro code1>, <macro code 2>) | Оператор сравнения, !=, сравнивает расширения macro code1 и macro code 2 | Все | %% | Используйте два символа “%”, если расширенный текст триггера должен содержать один символ “%”. | Все | %*(<macro code1>, <macro code 2>) | Перемножает расширения macro code1 и macro code 2 | Все | %+(<macro code1>, <macro code 2>) | Складывает расширения macro code1 и macro code 2 | Все | %-(<macro code1>, <macro code 2>) | Вычитает одно из другого расширения macro code1 и macro code 2 | Все | %/(<macro code1>, <macro code 2>) | Делит одно на другое расширения macro code1 и macro code 2 | Все | %:<variable> | Возвращает значение <variable >. | Все | %<(<macro code1>, <macro code 2>) | Оператор сравнения, <, сравнивает расширения macro code1 и macro code 2 | Все | %<=(<macro code1>, <macro code 2>) | Оператор сравнения, <=, сравнивает расширения macro code1 и macro code 2 | Все | %=(<variable>,<macro code>) | Присваивает расширение <macro code> переменной <variable>. | Все | %==(<macro code1>, <macro code 2>) | Оператор сравнения, ==, сравнивает расширения macro code1 и macro code 2 | Все | %>(<macro code1>, <macro code 2>) | Оператор сравнения, >, сравнивает расширения macro code1 и macro code 2 | Все | %>=(<macro code1>, <macro code 2>) | Оператор сравнения, >=, сравнивает расширения macro code1 и macro code 2 | Все | РИС. 16.21. | Макрокоманда | Описание | СУБД | %Action | Действие, до или после которого выстреливает триггер (напр., INSERT, UPDATE, DELETE). | Все | %Actions(<separator>) | Разделенный список действий, до или после которых выстреливает триггер (напр., INSERT or UPDATE). | Все | %And(<macro code1>,<macro code2>) | Выполняет операцию “логическое И” над булевскими предикатами, заданными в <macro code1> и <macro code2>. | Все | %AttDatatype | Создает строку, представляющую тип данных текущего атрибута. | Все | %AttFieldname | Создает строку, представляющую физическое имя поля текущего атрибута. | Все | %AttFieldWidth | Генерирует целое число, представляющее длину типа данных текущего атрибута (напр., varchar(50) -->50). | Все | %AttlsFK | Булевский предикат, который может быть использован как условие в выражении %If. Он определяет, входит ли текущий атрибут во внешний ключ. | Все | %AttlsPK | Булевский предикат, который может быть использован как условие в выражении %If. Он определяет, входит ли текущий атрибут в первичный ключ | Все | %AttName | Создает строку, представляющую логическое имя текущего атрибута. | Все | %AttNullOption | Создает строку, представляющую режим нулевых значений для текущего атрибута. | Все | %AttPhysDatatype | Генерирует физический тип данных текущего атрибута независимо от того, является ли этот тип данных типом данных, определенным пользователем. | Все | %Atts(<separator>,<function>,<prefix>) | Выдает список всех атрибутов сущности триггера, выполняя заданную функцию для каждого элемента. | Все | %AttValidation | Возвращает имя правила валидации, связанного с данным атрибутом; может быть использован в ForEachAtt или ForEachFKAtt. | Все | %Cardinality | Кардинальность связи. | Все | %Child | Физическое имя таблицы дочерней сущности связи. | Все | %ChildAtts(<separator>, <function>,<prefix>) | Выдает список всех атрибутов дочерней сущности связи, выполняя заданную функцию для каждого элемента. | Все | %ChildFK(<separator>, <function>) | Выдает список внешних ключей дочерней сущности связи, выполняя заданную функцию для каждого элемента. (update(customer_number) или update(customer_name) и т.д.). | Все | %ChildFKDecl(<old prefix>,<new prefix>,<separator>) | Выдает список внешних ключей дочерней сущности связи с их типами данных (См. %ParamDecl). | Все | %ChildNK(<separator>, <function>,<prefix>) | Генерирует разделенный список функций для каждого неключевого элемента дочерней сущности (напр., update(customer_number) or update(customer_nam e) or ....). | Все | %ChildNKDecl(<old prefix>,<new prefix>,<separator>) | Выдает список неключевыых атрибутов дочерней сущности связи с их типами данных (См. %ParamDecl) . | Все | РИС. 16.21. | | Макрокоманда | Описание | СУБД | %ChildParamDecl(<old prefix>,<new prefix>,<separator>) | Выдает список атрибутов дочерней сущности связи с их типами данных (См. %ParamDecl) . | Все | %ChildPK<separator>, <function>,<prefix>) | Генерирует разделенный список функций для каждого элемента первичного ключа дочерней сущности (напр., update (customer_number) or update(customer_name) or ....). | Все | %ChildPKDecl(<old prefix>,<new prefix>,<separator>) | Выдает список атрибутов первичного ключа дочерней сущности связи с их типами данных (См. %ParamDecl) . | Все | %Concat(<value1>,<value2>) | Производит конкатенацию <value1> и <value2>. Возвращает результат. | Все | %CustomTriggerDefaultFooter | Часть триггера, определенного пользователем - default footer, которая содержится в diagram-wide сегменте шаблона CUSTOM TRIGGER FOOTER. | Все | %CustomTriggerDefaultHeader | Часть триггера, определенного пользователем - default header, которая содержится в diagram-wide сегменте шаблона CUSTOM TRIGGER HEADER. | Все | %Datetime | Создает строку, представляющую текущую дату и время. | Все | %DBMS | Возвращает имя СУБД. | Все | %DBMSDelim | Возвращает разделитель операторов СУБД. | Все | %Decl(<arg>,<initial value>) | Объявляет <arg> как переменную и, если это задано, присваивает ей значение <initial value>. | Все | %Fire | Задает, когда выстреливает триггер (напр., BEFORE, AFTER). | INFORMIX Ingres ORACLE7 Rdb | %ForEachAtt(<table>, <separator>) { 15n<macro code> | |