Зраствуйте.
Вот вопросец появился, по поводу целесообразности изменения шаблонов
триггеров ErWin (4.*) при работе с FireBird.
К примеру, скрипт бизнес - правила "Запрет на удаление родительской записи"
в оригинале выглядит так:
/* ERwin Builtin %Datetime */
/* %Parent %VerbPhrase %Child ON CHILD UPDATE RESTRICT */
/* %ErwinRelationInfo */
select count(*)
from %Parent
where
/* %%JoinFKPK(NEW,%Parent," = "," and") */
%JoinFKPK(NEW,%Parent," = "," and") into numrows;
IF (
/* %%NotnullFK(NEW," is not null and") */
%NotnullFK(NEW," is not null and")
numrows = 0
) THEN
BEGIN
EXCEPTION ERWIN_CHILD_UPDATE_RESTRICT;
END
|
Это разворачивается в такой текст:
/* ERwin Builtin Thu Oct 27 21:05:51 2005 */
/* Users_Category определяют права Users ON CHILD UPDATE RESTRICT */
/* ERWIN_RELATION:PARENT_OWNER="", PARENT_TABLE="Users_Category"
CHILD_OWNER="", CHILD_TABLE="Users"
P2C_VERB_PHRASE="определяют права", C2P_VERB_PHRASE="",
FK_CONSTRAINT="grantes", FK_COLUMNS="users_category_id" */
select count(*)
from Users_Category
where
/* %JoinFKPK(NEW,Users_Category," = "," and") */
NEW.users_category_id = Users_Category.users_category_id into numrows;
IF (
/* %NotnullFK(NEW," is not null and") */
numrows = 0
) THEN
BEGIN
EXCEPTION ERWIN_CHILD_UPDATE_RESTRICT;
END
|
Ну вот, совсем не нравится, что используется count(*), хотя и с where.
Есть соблазн заменить на примерно след. скрипт:
/* %Parent %VerbPhrase %Child Запрет изменения дочерней записи */
IF (
%NotnullFK(NEW," is not null and")
not exists(
select *
from %Parent
where
%JoinFKPK(NEW,%Parent," = "," and"))
) THEN
BEGIN
EXCEPTION CUSTOM_RESTRICT 'Изменять нельзя: отсутствует запись в
связанной таблице "%EntityName(%Parent)"';
END
|
который "развернется" вот во что:
/* Users_Category определяют права Users Запрет изменения дочерней записи
*/
IF (
not exists(
select *
from Users_Category
where
NEW.users_category_id = Users_Category.users_category_id)
) THEN
BEGIN
EXCEPTION CUSTOM_RESTRICT 'Изменять нельзя: отсутствует запись в
связанной таблице "Категории пользователей"';
END
|
Нет ли в этом чего предосудительного (замена анализа Count(*) > 0 на not
Exists )? Не зря же там такое было...
Спасибо.
Posted via ActualForum NNTP Server 1.3