sql - Function to update a status flag for validity of other column? -
how create function compares card_id allowed_cards array elements?
if it's in array, column status must updated true.
create table client_1 ( id bigint not null, "time" timestamp without time zone default now(), status boolean, card_id character varying(10), constraint client_1_pkey primary key (id) ); create table allowed_cards ( allowed_cards character varying(10)[] ); insert allowed_cards values ('{dd3234,ff2342}');
enforce valid card_id @ times
first of all, if need table card_allowed, use plain varchar or text column (with multiple entries), not array:
create table card_allowed ( card_id varchar(10) not null primary key ); insert card_allowed values ('dd3234'), ('ff2342'); next, enforce valid cards, use fk constraint:
create table client_1 ( client_1_id bigint not null primary key, tstz timestamptz default now(), -- card_valid boolean, card_id varchar(10), constraint client_1_card_id_fk foreign key (card_id) references card_allowed ); since column can null, can leave empty if don't have valid card_id.
you don't need additional column (you named status, renamed card_valid).
i changed column names make more useful. among other things, using column name tstz instead of , reserved word in standard sql , misleading actual timetimestamptz column.
if need allow invalid values in card_id (really?), fk constraint not possible. there other options:
only check new entries
you can "fake" immutable function runs check:
create or replace function f_card_allowed(text) returns bool $func$ select exists (select 1 card_allowed card_allowed = $1); $func$ language sql stable; -- not immutable the function not really immutable, because depends on values table. stable. result of same call can change between transactions. definition check constraints expect immutable functions, allow leeway (especially temporal functions) stable tolerated. should mark check constraint not valid document this, though:
alter table client_1 add constraint client_1_card_allowed check (f_card_allowed(card_id)) not valid; the difference: referential integrity not enforced @ times fk constraint. rows checked when inserted / updated , must valid @ time. no promises made status of existing rows: might have changed values in card_allowed now. details:
set status once
now need additional flag card_valid commented out in table definition above. have no fk constraint:
update client_1 c set card_valid = exists (select 1 card_allowed card_id = c.card_id); set status after every change
you same in trigger function every inserted / updated row:
create or replace function trg_client_1_insupbef() returns trigger $body$ begin new.card_valid := exists (select 1 card_allowed card_id = new.card_id); return new; end $body$ language plpgsql; create trigger insupbef before insert or update on client_1 each row execute procedure trg_client_1_insupbef();
Comments
Post a Comment