Some SQL targeted at PostgreSQL. This was intended as the database backend for user management in an online shop system.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

120 lines
3.5 KiB

-- Triggerfunktionen zu Waren/Warengruppen --
-- [
create function create_valid_produkt_typ_mask()
returns TRIGGER as '
DECLARE
mask bit varying;
freepos int4 := 0;
err_msg text;
new_len int4;
old_len int4;
BEGIN
IF TG_OP <> ''UPDATE'' AND TG_OP <> ''INSERT'' THEN
err_msg := TG_NAME || '': called for wrong action '' || TG_OP;
RAISE EXCEPTION ''%'', err_msg;
END IF;
new_len := bit_length(NEW.produkt_typ);
IF TG_OP = ''UPDATE'' THEN
new_len := bit_length(OLD.konto_typ);
ELSE
old_len := fibu.konto_typ_min_len();
END IF;
IF new_len < old_len THEN
NEW.konto_typ := NEW.konto_typ::BIT(old_len)>>old_len-new_len;
END IF;
IF old_len < new_len THEN
EXECUTE ''update fibu.konten_typen set konto_typ=konto_typ'' ||
''::BIT('' || new_len || '')>>'' || new_len-old_len;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function set_tiefe()
returns TRIGGER as '
DECLARE
BEGIN
IF NEW.parent IS NOT NULL THEN
select INTO NEW.tiefe tiefe+1 from
waren.get_warengruppe(NEW.parent);
update waren.warengruppe set is_parent=''true'' where
_id_=NEW.parent;
ELSE
NEW.tiefe := 0;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_update_delete_check_is_parent()
returns TRIGGER as '
DECLARE
i int4;
BEGIN
select INTO i count(*) from waren.warengruppe where
parent=OLD.parent;
IF i > 0 THEN
update waren.warengruppe set is_parent=''true'' where
_id_=OLD.parent;
ELSE
update waren.warengruppe set is_parent=''false'' where
_id_=OLD.parent;
END IF;
RETURN OLD;
END;
' language 'plpgsql';
create function on_update_check_tiefe()
returns TRIGGER as '
DECLARE
row waren.warengruppe%ROWTYPE;
parent_count int4;
BEGIN
IF NEW.parent IS NULL THEN
NEW.tiefe := 0;
ELSE
IF OLD.parent IS NULL OR
OLD.parent <> NEW.parent THEN
select INTO NEW.tiefe tiefe+1 from
waren.get_warengruppe(NEW.parent);
END IF;
END IF;
IF NEW.tiefe <> OLD.tiefe THEN
FOR row IN select * from waren.warengruppe where
parent=NEW._id_
LOOP
update waren.warengruppe set tiefe=NEW.tiefe+1 where
_id_=row._id_;
END LOOP;
END IF;
RETURN NEW;
END;
' language 'plpgsql';
create function on_delete_new_parent()
returns TRIGGER as '
DECLARE
row waren.warengruppe%ROWTYPE;
BEGIN
FOR row IN select * from waren.warengruppe where
parent=OLD._id_
LOOP
update waren.warengruppe set parent=OLD.parent where
_id_=row._id_;
END LOOP;
RETURN OLD;
END;
' language 'plpgsql';
-- ]
-- Ende Triggerfunktionen zu Waren/Warengruppen --