Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / вопрос про функцию и ограничение / 9 сообщений из 9, страница 1 из 1
26.04.2009, 21:58
    #35954848
mansoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
сабж есть некая таблица
create table one (col1 int, col2 int);
с одной строкой
insert into one values(1, 2);

есть функция
CREATE FUNCTION Check1 ()
RETURNS INT
RETURN
SELECT COUNT(*) FROM one

хочется создать ограничение по типу

alter table one
add constraint checkName CHECK (Check1 ()>=1)

но выдаёт ошибку, можно ли в ДБ2 сделать чтото подобное вообще?
...
Рейтинг: 0 / 0
27.04.2009, 09:55
    #35955181
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
mansoff,

В db2 check constraint не может содержать функции с contains sql или reads sql.
Вам поможет after delete триггер.
...
Рейтинг: 0 / 0
27.04.2009, 12:44
    #35955774
mansoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
спасибо, ещё вопрос если уже пустую таблицу "заCHECK'ать" через тригер или ещё как-нибудь, позволит ли DB2 чтобы при пустой таблице жило ограничение c нашим правилом "not empty", например как в MS SQL, если таблица пустая - то к ней не применяются ограничения и тд
...
Рейтинг: 0 / 0
27.04.2009, 12:59
    #35955833
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
mansoffспасибо, ещё вопрос если уже пустую таблицу "заCHECK'ать" через тригер или ещё как-нибудь, позволит ли DB2 чтобы при пустой таблице жило ограничение c нашим правилом "not empty", например как в MS SQL, если таблица пустая - то к ней не применяются ограничения и тдНе понял вопрос.
На примере можете объяснить, что вы сделать хотите?
...
Рейтинг: 0 / 0
27.04.2009, 16:55
    #35956612
mansoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
эм я хочу переписать на DB2
что-то вроде такого

MS SQL
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
CREATE TABLE CheckTbl (col1 int, col2 int);
GO
CREATE FUNCTION CheckFnctn()
RETURNS int
AS 
BEGIN
   DECLARE @retval int
   SELECT @retval = COUNT(*) FROM CheckTbl
   RETURN @retval
END;
GO
ALTER TABLE CheckTbl
ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >=  1  );
GO

MS SQL при пустых таблицах не проверяет ограничения на них и в итоге получаеться такой парадокс - что стоит ограничение "not empty" на пустой таблице

на DB2 можно добиться такого же парадоксального эффекта?
то что при помощи функции+чек - этого не добиться, я уже понял, может есть какие обходные пути?)
...
Рейтинг: 0 / 0
27.04.2009, 17:30
    #35956735
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
mansoffна DB2 можно добиться такого же парадоксального эффекта?
то что при помощи функции+чек - этого не добиться, я уже понял, может есть какие обходные пути?)Можно.
Код: plaintext
1.
2.
3.
4.
5.
create trigger CheckTbl_ads
after delete on CheckTbl 
for each statement
when (not exists(select  1  from CheckTbl fetch first  1  row only))
signal sqlstate '75000' set message_text = 'Table can''t be empty!!!';
...
Рейтинг: 0 / 0
27.04.2009, 21:05
    #35957135
mansoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
эм, мысль ясна но хотелось бы немного уточнить, чтобы потом не попасть в просак

Код: plaintext
1.
2.
3.
4.
create trigger CheckTbl_ads  // тут всё ясно 
after delete on CheckTbl // при удалении
for each statement // вот тут немного не понятно зачем здесь for ?
when (not exists(select  1  from CheckTbl fetch first  1  row only)) // если не существует в таблице CheckTbl первой строки то - таблица пустая
signal sqlstate '75000' set message_text = 'Table can''t be empty!!!';

я правильно понял?
...
Рейтинг: 0 / 0
28.04.2009, 09:49
    #35957588
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
mansoff,

1. В for each [row | statement] указывается будет ли триггер вызываться для каждой удалённой строки строки или 1 раз для всей команды delete.
См. CREATE TRIGGER .
2. Триггер будет срабатывать, если после удаления в таблице не осталось ни одной строки.
Предложенный способ выяснения этого эффективнее подсчёта кол-ва строк в таблице (таблица может быть большая).
Можно было бы написать:
Код: plaintext
1.
when ((select count( 1 ) from CheckTbl)= 0 )
signal ...
...
Рейтинг: 0 / 0
28.04.2009, 20:05
    #35959480
mansoff
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
вопрос про функцию и ограничение
спасибо сенсей :)
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / вопрос про функцию и ограничение / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]