Hallo an alle,
bin neu in postgresql bin aber ansonsten in gängigen Programiersprachen und mySQL relativ fit.
Da ich mich jetzt seit kurzer Zeit mit postgresql beschägtigen muß … inzwischen auch mit immer mehr Spaß … wegen doch toller Möglichkeit hat sich mir jetzt ein Problem aufgetan das ich gerne elegant lösen will.
CREATE TABLE user (
id SERIAL,
email VARCHAR(128) UNIQUE NOT NULL,
username VARCHAR(32) UNIQUE NOT NULL CHECK (length(trim(username))>3),
create TIMESTAMP,
) WITHOUT OIDS;
ALTER TABLE user ADD PRIMARY KEY (id);
CREATE TABLE attributes (
id INTEGER NOT NULL,
key VARCHAR(16) NOT NULL,
text TEXT,
binary BYTEA,
modified_at TIMESTAMP,
modified_by INTEGER
) WITHOUT OIDS;
CREATE INDEX idx_id ON attributes (id);
CREATE INDEX idx_key ON attributes (key);
ALTER TABLE attributes ADD FOREIGN KEY (id) REFERENCES user (id) ON UPDATE RESTRICT ON DELETE RESTRICT;
CREATE FUNCTION stamp_it() RETURNS trigger AS $stamp_it$
BEGIN
IF OLD.modified_by IS NULL THEN
NEW.modified_by := 1;
ELSE
IF [color=red][B]NEW.modified_by typeof INTEGER[/B][/color] ([B]???[/B]) THEN
NEW.modified_by := OLD.modified_by;
ELSE
SELECT INTO NEW.modified_by id FROM user WHERE username=OLD.modified_by;
END IF;
END IF;
NEW.modified_at := current_timestamp;
RETURN NEW;
END;
$stamp_it$ LANGUAGE plpgsql;
CREATE TRIGGER stamp_it BEFORE INSERT OR UPDATE ON attributes FOR EACH ROW EXECUTE PROCEDURE stamp_it();
-
Ich bin mir nicht im klaren ob folgens prinzipiell geht: Ich übergebe einer INSERT oder UPDATE Anweisung einen String und ein Trigger wandelt diesen String (User) in einen Integerwert um (via Select) und ersetzt diesen im Datensatz.
-
Gibt es eine Funktion oder Operator wie gettype() in PHP oder typeof in Java mit der ich in der Funktion bestimmen kann was es für einen type ich da habe.
-
diesen Varianten sollen funktionieren und durch “innere” Logik ordentlich behandelt werden
INSERT INTO attributes (id,key,text) VALUES (1,'nickname','Smiley')
INSERT INTO attributes (id,key,text,modified_by) VALUES (1,'nickname','Smiley','admin')
INSERT INTO attributes (id,key,text,modified_by) VALUES (1,'nickname','Smiley',1)
-
Gibt es eine elegantere Lösung?
-
Würdet ihr lieber character varying(n) benutzen statt des Alias varchar(n) ? dito für alle anderen aliase…
Vielen Dank für die Hilfe.