On 24/12/2017 11:56, Shane Dev wrote:

Related to my previous question
https://www.mail-archive.com/sqlite-users@mailinglists.sqlit
e.org/msg107527.html,
I want to prevent the client from inserting a cycle.

For example -

sqlite> .sch edges
CREATE TABLE edges(parent integer not null, child integer not null,
constraint self_reference check (parent<>child));

sqlite> select * from edges;
parent  child
1       2
1       3
2       4

insert into edges select 2, 5; -- ok
insert into edges select 2, 1; -- should not be allowed.
insert into edges select 4, 1; -- should not be allowed.

Many kinds of insertions can be prevented using triggers. Existing cycles can be detected using a recurisve common table expression. However, since CTEs are not supported inside triggers, I assume they can't be used for
this purpose. Is there another way?



Sorry for ignoring the two earlier repiies, but it looks that WITH can be used inside triggers. Like

create trigger ins_edges before insert on edges
begin
    with recursive r as (
        select  new.child
        union all
        select  edges.child
        from    r
        join    edges on edges.parent=r.child
            )
    select raise (FAIL, 'example error')
    from    r where child=new.parent;
end
;



_______________________________________________
sqlite-users mailing list
sqlite-users@mailinglists.sqlite.org
http://mailinglists.sqlite.org/cgi-bin/mailman/listinfo/sqlite-users

Reply via email to