2017-12-19 2 views
0

Weiß jemand, ob Sie eine ELEVATION EXCEPTION erstellen können, die angezeigt wird, wenn Sie einen falschen Datentyp eingeben? Beispiel offensichtlich funktioniert es nicht, aber es ist ein Beispiel dafür, was ich sucheErstellen einer RAISE EXCEPTION zum Überprüfen der Datentypen in postgresql

CREATE TABLE products(
    name_pr varchar(20), 
    quantity smallint, 
    price smallint, 
    last_update timestamp, 
    latest_user_bd text 
); 
CREATE OR REPLACE FUNCTION validate_products() 
RETURNS TRIGGER AS 
$BODY$ 
BEGIN 

    IF NEW.price IS NOT SMALLINT THEN 
    RAISE EXCEPTION 'You must enter the Price'; 
    END IF; 

    NEW.last_update = now(); 
    NEW.latest_user_bd = user; 
    RETURN NEW; 
END; 
$BODY$ 
LANGUAGE plpgsql; 

CREATE TRIGGER validate_products 
BEFORE INSERT OR UPDATE 
ON products 
FOR EACH ROW EXECUTE PROCEDURE validate_products(); 

Beispiel einfügen in C#

string query = "INSERT INTO products(name_pr, quantity, price) VALUES('" + txtName.Text + "', '" + txtQuantity.Text + "','" + txtPrice.Text + "')"; 
con.Open(); 
comand = new NpgsqlCommand(query, con); 
+0

Em, wenn die Daten nicht 'smallint' sind, erwarte ich, dass Sie sowieso eine Ausnahme bekommen würden, weil Postgres das nicht passen kann? – zaitsman

+0

Was ist mit der Validierung auf der C# -Seite? Es sieht so aus, als ob Sie den Befehl an Postgres senden möchten. Wenn Sie die Abfrage parametrisieren, wird es auch kugelsicher, auch wenn es geht. – Hambone

Antwort

0

Sie können nicht äußere Ausnahmen in Postgres von TOP Befehl auszulösen. Sie können Parameter an die PostgreSQL-Funktion übergeben, und dort können Sie den Befehl im geschützten Block ausführen. Dort können Sie die Ausnahme behandeln. Einige mögen

CREATE OR REPLACE FUNCTION new_product(__price text) 
RETURNS void AS $$ 
DECLARE _price smallint; 
BEGIN 
    _price := __price::smallint; 
    INSERT INTO product(..) (_price); 
EXCEPTION WHEN invalid_text_representation, numeric_value_out_of_range THEN 
    IF price IS NULL THEN 
    RAISE EXCEPTION 'the price is not valid smallint value %', _price; 
    END IF; 
END; 
$$ LANGUAGE plpgsql; 

Ich mag diese "untypisierte" Funktion nicht - aber sie tut, was Sie wollen.

Auf Sekundenzeiger PostgreSQL-Typen sind nicht Variantentypen, Muster so

IF some IS NOT smallint THEN -- has not sense 

ist Unsinn in plpgsql. Sie können regexp verwenden, Sie können numeric verwenden und Limits testen, oder Sie können zu smallint umwandeln und die Ausnahme abfangen.

PLpgSQL ist streng typisierte Sprache (auch PostgreSQL SQL), daher sind einige Muster aus dynamisch weniger typisierten Sprachen dort nicht möglich.

Normalerweise sollten die Typen und ihre Werte zuerst auf UI-Ebene überprüft werden - und sekundär sollte es auf SQL-Ebene sicher angewendet werden. SQL-Ebene überprüft, aber es kann eine häufige Ausnahme auslösen. Die Parameterüberprüfung ist eine bessere Aufgabe für die Präsentationsebene.

Verwandte Themen