에 삽입 내가
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 함수에 매개 변수를 전달할 수 있으며 거기에서 보호 된 블록에서 명령을 실행할 수 있습니다. 거기에서 예외를 처리 할 수 있습니다. Some like
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