Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как игнорировать запись ? / 7 сообщений из 7, страница 1 из 1
22.10.2008, 13:09
    #35609007
valuez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
Доборое время суток

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

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

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

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
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;

...
Рейтинг: 0 / 0
22.10.2008, 13:44
    #35609166
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
select login from admins where admins.login = v_login and not is_deleted
...
Рейтинг: 0 / 0
22.10.2008, 13:57
    #35609224
valuez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
не то... всё равно выкидывает exception, нужно чтобы при is_deleted = true его не выкидывало а просто игнорировался старый логин
...
Рейтинг: 0 / 0
22.10.2008, 14:55
    #35609484
Ёш
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
авторВ каждой таблице есть unique поле login не Primary key
login varchar(32) not null uniqueправильно ? тогда Вам нужно снять ограничение unique во всех трёх таблицах.

ps: своей не удобной и неверной структурой БД Вы создаёте себе грандиозные трудности, которые потом пытаетесь мужественно преодолевать... зачем ?


--
„Истина — это вовсе не то, что можно убедительно доказать, это то, что
делает всё проще и понятнее“ — Антуан де Сент-Экзюпери
...
Рейтинг: 0 / 0
22.10.2008, 15:01
    #35609498
valuez
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
у меня так
авторis_deleted boolean not null default false
и login varchar(32) not null

unique нету
...
Рейтинг: 0 / 0
22.10.2008, 17:06
    #35609881
LeXa NalBat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
valuezне то... всё равно выкидывает exceptionрасскажите хотя бы, какой именно exeption. а еще лучше тестовый пример начиная от create table, create function, insert тестовых данных в таблицу, select function() с exeption-ом.
...
Рейтинг: 0 / 0
24.10.2008, 19:06
    #35615462
juniorDBE
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
как игнорировать запись ?
valuez
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
	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;


Расскожите пожалуйста волшебный смысл v_violation := true; а потом сразу if v_violation = true then? Советую подумать над общей логикой всей функции вначале...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / как игнорировать запись ? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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