Autocomplete

Kampfgummibaerlie

Datenbank-Guru
Beiträge
731
Nach einer Weile Pause fange ich wiedermal an, und es würde mich interessieren, ob wir jemals durchgekaut haben, dass zum Beispiel folgendes Beispiel gelöst wurde:

Ich möchte eine Mietung in der Zukunft eintragen, und diese sollte dann für 2 Stunden gelten.

Beispielcodes:
Code:
create database mimoso;

Code:
create table maschinen(id serial primary key, name text unique);

Code:
insert into maschinen(name) values ('Hansi');

Code:
create table vermietungen(id serial primary key, maschine integer references maschinen(id), mietzeit tsrange);

Weil es ist mir über einen Default-Wert nicht gelungen, weil sich dieser nicht auf den eigenen Datensatz beziehen darf, oder so.

Problem:
Ich gebe an, dass die Hansi Maschine Morgen ab 15:00 bis 17:00 gemietet werden soll, ich würde aber gerne innerhalb der Datenbank das ganze abwickeln.

Eiigene Lösung: (hat schonmal funktioniert, würde ich sicher wieder hinbekommen)
Einfach an der Oberfläche, die benutzt werden sollte, aber ich frage Sicherheitshalber nach, ob das irgendwie über Trigger-Procedures oder sowas möglich sei.

Danke :)
Habe ja gelernt, dass man möglichst viel innerhalb der Datenbank abwickeln sollte. Oder ist das enorm belastend für den Server, oder so?
 
Werbung:
bitte etwas entknoten. Was soll automatisch eingetragen werden? Wenn ab 15:00 eingetrafen wird, soll, falls das Feld leer ist, als Ende die Startzeit + 2 Stunden stehen?
Falls ja: vor-insert-trigger, der das prüft und, falls leer, einträgt.
 
Ja, exakt so hätte ich es mir vorgestellt, komme dazu aber zu einem Problem, der bei folgender Function liegen soll (laut PGAdmin):

Code:
  1 create or replace function vermietungen_autocomplete() returns trigger as $$ 
  2 begin
  3 if upper(new.mietzeit) is null then
  4 insert into vermietungen(mietzeit) values (tsrange(lower(new.mietzeit), lower(new.mietzeit)+'2 hours'::interval));
  5 else
  6 insert into vermietungen(mietzeit) values (tsrange(lower(new.mietzeit), upper(new.mietzeit)));
  7 end if;
  8 return new;
  9 end;
10 $$ language plpgsql;

er sagt 3 Fehler an, Reihe 3, 6 und 4.....

Also versuche ich die inserts falsch anzugehen, und die IF-Abfrage offenbar auch :/
sollte eher am Ball bleiben ^^
 
Werbung:
Code:
test=*# create table vermietung (id int, von_bis tsrange);
CREATE TABLE
test=*# create or replace function complete() returns trigger as $$begin if upper(new.von_bis) is null then new.von_bis = tsrange(lower(new.von_bis), lower(new.von_bis)+'2hours'::interval,'[)'); end if; return new; end; $$language plpgsql;
CREATE FUNCTION
test=*# create  trigger  trg1 before insert on vermietung for each row execute procedure complete();
CREATE TRIGGER
test=*# insert into vermietung values (1, '[2018-11-13 20:00:00,)');
INSERT 0 1
test=*# select * from vermietung;
 id |                    von_bis                   
----+-----------------------------------------------
  1 | ["2018-11-13 20:00:00","2018-11-13 22:00:00")
(1 row)

test=*#

Select Bier! Now!
 
Zurück
Oben