Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> игнорирование 
V
    Опции темы
Value
Дата 22.10.2008, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



Доборое время суток

Есть вопрос (может не правильно сформулирую, но попробую) :

СУБД  PostgreSQL

Я уже писал, у меня 3 таблицы admins, customers, owners. в каждом из них есть поле
is_deleted boolean not null default false
и login varchar(32) not null

Поле is_deleted подразумевает то, что если оно равно true то этот пользователь стёрт. Но в действительности стерать нельзя, а мне надо сделать чтобы он был неактивен, и при создании нового пользователя при проверке, если такой пользователь был, но у него is_deleted = true, то логин игрорируется и создаётся пользователь с таким же логином.
проверка на уникальность

Код

create or replace function sp_check_login (p_login varchar)
returns boolean
as $$
declare
    v_login varchar;
    v_violation boolean;
begin
    v_login := p_login;
loop
    --checking table admins
    if exists (select login from admins where admins.login = v_login) then 
    v_violation := true;
        if v_violation = true then 
            raise exception 'login % already exists in table admins', v_login ; 
            exit; 
        else v_violation = false;
        end if;
    end if;
    --checking table customers
    if exists (select login from customers where customers.login = v_login) then 
    v_violation = true;
        if v_violation = true then
            raise exception 'login % already exists in table customers', v_login; 
            exit;
        else v_violation = false;
        end if;
    end if;
    --checking table owners
    if exists (select login from owners where owners.login = v_login) then
    v_violation = true;
    if v_violation = true then
        raise exception 'login % already exists in table owners', v_login; 
        exit;
            else v_violation = false;
        end if;
    end if;
    return v_violation;
end loop;
    
end;
$$language plpgsql;



PM MAIL   Вверх
Akina
Дата 22.10.2008, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Цитата(Value @  22.10.2008,  13:32 Найти цитируемый пост)
при создании нового пользователя при проверке, если такой пользователь был, но у него is_deleted = true, то логин игрорируется и создаётся пользователь с таким же логином.

Так в чем проблема? если запрос where login=v_login and not is_deleted вернет 1 запись - логин занят, 0 записей - свободен (и неважно, нет его вообще или он удален), 2 и более - нарушение целостности БД. 


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Value
Дата 22.10.2008, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



а дело в том что из where login=v_login and not is_deleted 
при   select sp_check_login ('cust3')  (такой пользователь существует и is_deleted = true)
выкидывает мой exception, а мне этого не надо
В смысле если id_deleted = true, то функция должна просто этот логин игнорировать и не кидать exception'ов
PM MAIL   Вверх
Akina
Дата 22.10.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



А откуда, позвольте узнать, exception? ты же его сам напрограммил...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
vladimir74
Дата 22.10.2008, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: нет
Всего: 3



так у тебя login_name  уникальное поле?
ну тогда у тебя никак не получится добавлять два одинаковых значения!! Для этого и существует уникальность. Разве что при удалении добовлять какие то символы, что бы потом имя нового юзера не совпадало с удаленым.

Вообще ИМХО или удаляй его, если 100% знаешь что он тебе больше не понадобится, или убери уникальность с поля, и проверяй чтоб небыло повторений ручками уже из программы  с условием от Akina...

Добавлено через 6 минут и 20 секунд
если это поле не проверяет на уникальность, то Akina, опять же все сказал
просто замени условие...
Код

    if exists (select login from admins where admins.login = v_login  and not is_deleted ) then 
    v_violation := true;
        if v_violation = true then 
            raise exception 'login % already exists in table admins', v_login ; 
            exit; 


Это сообщение отредактировал(а) vladimir74 - 22.10.2008, 13:57
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
vladimir74
Дата 22.10.2008, 14:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 241
Регистрация: 28.11.2006

Репутация: нет
Всего: 3



и кстати зачем тебе if v_violation = true then  ?
если я правильно помню по
Код

            raise exception 'login % already exists in table admins', v_login ; 
            exit; 

ты выходишь из ф-ции а щначит дальше не проверка не пойдет...
проще сделать так..
Код

create or replace function sp_check_login (p_login varchar)
returns boolean
as $$
declare
    v_login varchar;
    v_violation boolean;
begin
    v_login := p_login;
loop
    v_violation := true;
    --checking table admins
    if exists (select login from admins where admins.login = v_login and not is_deleted) then 
           raise exception 'login % already exists in table admins', v_login ; 
           exit; 
    end if;
    --checking table customers
    if exists (select login from customers where customers.login = v_login and not is_deleted) then 
            raise exception 'login % already exists in table customers', v_login; 
            exit;
    end if;
    --checking table owners
    if exists (select login from owners where owners.login = v_login and not is_deleted) then
        raise exception 'login % already exists in table owners', v_login; 
        exit;
    end if;
    v_violation := false;
    return v_violation;
end loop;
    
end;
$$language plpgsql;

и еще вопрос зачем тебе бесконечный цикл, и если честно я не помню даст ли return выход из него или тебе надо задать явное условие с выходом exit .....

Это сообщение отредактировал(а) vladimir74 - 22.10.2008, 14:13
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Value
Дата 22.10.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



поле login  не unique... 

повторяю что при таком коде 
Код

    if exists (select login from admins where admins.login = v_login  and not is_deleted ) then 
    v_violation := true;
        if v_violation = true then 
            raise exception 'login % already exists in table admins', v_login ; 
            exit; 


и при заведомо введённом логине cust3, где is_deleted = true
выкидывает exception 
Код

ERROR:  login cust3 already exists in table customers


исходя из выше сказанного ф-ия недолжна выкидывать exeption если is_deleted = true
PM MAIL   Вверх
Value
Дата 23.10.2008, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 2.12.2005

Репутация: нет
Всего: нет



Cпасибо всё заработало...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0575 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.