に挿入私は
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();
例を探しています何の例です。 PostgreSQL関数にパラメータを渡すことができます。そこでは、保護されたブロックでコマンドを実行できます。ここで例外を処理できます。いくつかのような
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;
私はこの "タイプのない"機能が好きではありませんが、あなたが望むものです。秒針PostgreSQLの種類に
は、バリアント型ではないので、パターン
IF some IS NOT smallint THEN -- has not sense
はplpgsqlがナンセンスです。あなたは、正規表現を使用することができますnumeric
を使用して制限のテスト、またはsmallintにキャストし、例外をキャッチすることができます。
PLpgSQLは厳密な型付き言語(PostgreSQL SQLも)であるため、より動的でない型付き言語のパターンはそこでは使用できません。
通常、タイプとその値はUIレベルで最初にチェックする必要があります。また、セカンダリはSQLレベルで安全に適用する必要があります。 SQLレベルは再チェックしますが、共通の例外が発生する可能性があります。パラメータチェックは、プレゼンテーションレイヤーの方が優れています。
Em、データが 'smallint'でない場合、私はpostgresがそれに収まらないので、とにかく例外を受け取ると思いますか? – zaitsman
C#側で検証するのはどうですか? Postgresに実際にコマンドを送信する前に、達成したいことができるかのように見えます。また、クエリをパラメータ化すると、たとえそれが実行されても防弾になります。 – Hambone