📄 rules.sql
字号:
where X.a = Y.a group by X.a, X.b;create function rtest_viewfunc1(int4) returns int4 as 'select count(*)::int4 from rtest_view2 where a = $1' language 'sql';create view rtest_vview5 as select a, b, rtest_viewfunc1(a) as refcount from rtest_view1;insert into rtest_view1 values (1, 'item 1', 't');insert into rtest_view1 values (2, 'item 2', 't');insert into rtest_view1 values (3, 'item 3', 't');insert into rtest_view1 values (4, 'item 4', 'f');insert into rtest_view1 values (5, 'item 5', 't');insert into rtest_view1 values (6, 'item 6', 'f');insert into rtest_view1 values (7, 'item 7', 't');insert into rtest_view1 values (8, 'item 8', 't');insert into rtest_view2 values (2);insert into rtest_view2 values (2);insert into rtest_view2 values (4);insert into rtest_view2 values (5);insert into rtest_view2 values (7);insert into rtest_view2 values (7);insert into rtest_view2 values (7);insert into rtest_view2 values (7);select * from rtest_vview1;select * from rtest_vview2;select * from rtest_vview3;select * from rtest_vview4 order by a, b;select * from rtest_vview5;insert into rtest_view3 select * from rtest_vview1 where a < 7;select * from rtest_view3;delete from rtest_view3;insert into rtest_view3 select * from rtest_vview2 where a != 5 and b !~ '2';select * from rtest_view3;delete from rtest_view3;insert into rtest_view3 select * from rtest_vview3;select * from rtest_view3;delete from rtest_view3;insert into rtest_view4 select * from rtest_vview4 where 3 > refcount;select * from rtest_view4 order by a, b;delete from rtest_view4;insert into rtest_view4 select * from rtest_vview5 where a > 2 and refcount = 0;select * from rtest_view4;delete from rtest_view4;---- Test for computations in views--create table rtest_comp ( part text, unit char(4), size float);create table rtest_unitfact ( unit char(4), factor float);create view rtest_vcomp as select X.part, (X.size * Y.factor) as size_in_cm from rtest_comp X, rtest_unitfact Y where X.unit = Y.unit;insert into rtest_unitfact values ('m', 100.0);insert into rtest_unitfact values ('cm', 1.0);insert into rtest_unitfact values ('inch', 2.54);insert into rtest_comp values ('p1', 'm', 5.0);insert into rtest_comp values ('p2', 'm', 3.0);insert into rtest_comp values ('p3', 'cm', 5.0);insert into rtest_comp values ('p4', 'cm', 15.0);insert into rtest_comp values ('p5', 'inch', 7.0);insert into rtest_comp values ('p6', 'inch', 4.4);select * from rtest_vcomp order by part;select * from rtest_vcomp where size_in_cm > 10.0 order by size_in_cm using >;---- In addition run the (slightly modified) queries from the-- programmers manual section on the rule system.--CREATE TABLE shoe_data ( shoename char(10), -- primary key sh_avail integer, -- available # of pairs slcolor char(10), -- preferred shoelace color slminlen float, -- miminum shoelace length slmaxlen float, -- maximum shoelace length slunit char(8) -- length unit);CREATE TABLE shoelace_data ( sl_name char(10), -- primary key sl_avail integer, -- available # of pairs sl_color char(10), -- shoelace color sl_len float, -- shoelace length sl_unit char(8) -- length unit);CREATE TABLE unit ( un_name char(8), -- the primary key un_fact float -- factor to transform to cm);CREATE VIEW shoe AS SELECT sh.shoename, sh.sh_avail, sh.slcolor, sh.slminlen, sh.slminlen * un.un_fact AS slminlen_cm, sh.slmaxlen, sh.slmaxlen * un.un_fact AS slmaxlen_cm, sh.slunit FROM shoe_data sh, unit un WHERE sh.slunit = un.un_name;CREATE VIEW shoelace AS SELECT s.sl_name, s.sl_avail, s.sl_color, s.sl_len, s.sl_unit, s.sl_len * u.un_fact AS sl_len_cm FROM shoelace_data s, unit u WHERE s.sl_unit = u.un_name;CREATE VIEW shoe_ready AS SELECT rsh.shoename, rsh.sh_avail, rsl.sl_name, rsl.sl_avail, int4smaller(rsh.sh_avail, rsl.sl_avail) AS total_avail FROM shoe rsh, shoelace rsl WHERE rsl.sl_color = rsh.slcolor AND rsl.sl_len_cm >= rsh.slminlen_cm AND rsl.sl_len_cm <= rsh.slmaxlen_cm;INSERT INTO unit VALUES ('cm', 1.0);INSERT INTO unit VALUES ('m', 100.0);INSERT INTO unit VALUES ('inch', 2.54);INSERT INTO shoe_data VALUES ('sh1', 2, 'black', 70.0, 90.0, 'cm');INSERT INTO shoe_data VALUES ('sh2', 0, 'black', 30.0, 40.0, 'inch');INSERT INTO shoe_data VALUES ('sh3', 4, 'brown', 50.0, 65.0, 'cm');INSERT INTO shoe_data VALUES ('sh4', 3, 'brown', 40.0, 50.0, 'inch');INSERT INTO shoelace_data VALUES ('sl1', 5, 'black', 80.0, 'cm');INSERT INTO shoelace_data VALUES ('sl2', 6, 'black', 100.0, 'cm');INSERT INTO shoelace_data VALUES ('sl3', 0, 'black', 35.0 , 'inch');INSERT INTO shoelace_data VALUES ('sl4', 8, 'black', 40.0 , 'inch');INSERT INTO shoelace_data VALUES ('sl5', 4, 'brown', 1.0 , 'm');INSERT INTO shoelace_data VALUES ('sl6', 0, 'brown', 0.9 , 'm');INSERT INTO shoelace_data VALUES ('sl7', 7, 'brown', 60 , 'cm');INSERT INTO shoelace_data VALUES ('sl8', 1, 'brown', 40 , 'inch');-- SELECTs in docSELECT * FROM shoelace ORDER BY sl_name;SELECT * FROM shoe_ready WHERE total_avail >= 2 ORDER BY 1; CREATE TABLE shoelace_log ( sl_name char(10), -- shoelace changed sl_avail integer, -- new available value log_who name, -- who did it log_when timestamp -- when );-- Want "log_who" to be CURRENT_USER,-- but that is non-portable for the regression test-- - thomas 1999-02-21 CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data WHERE NEW.sl_avail != OLD.sl_avail DO INSERT INTO shoelace_log VALUES ( NEW.sl_name, NEW.sl_avail, 'Al Bundy', 'epoch' );UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';SELECT * FROM shoelace_log; CREATE RULE shoelace_ins AS ON INSERT TO shoelace DO INSTEAD INSERT INTO shoelace_data VALUES ( NEW.sl_name, NEW.sl_avail, NEW.sl_color, NEW.sl_len, NEW.sl_unit); CREATE RULE shoelace_upd AS ON UPDATE TO shoelace DO INSTEAD UPDATE shoelace_data SET sl_name = NEW.sl_name, sl_avail = NEW.sl_avail, sl_color = NEW.sl_color, sl_len = NEW.sl_len, sl_unit = NEW.sl_unit WHERE sl_name = OLD.sl_name; CREATE RULE shoelace_del AS ON DELETE TO shoelace DO INSTEAD DELETE FROM shoelace_data WHERE sl_name = OLD.sl_name; CREATE TABLE shoelace_arrive ( arr_name char(10), arr_quant integer ); CREATE TABLE shoelace_ok ( ok_name char(10), ok_quant integer ); CREATE RULE shoelace_ok_ins AS ON INSERT TO shoelace_ok DO INSTEAD UPDATE shoelace SET sl_avail = sl_avail + NEW.ok_quant WHERE sl_name = NEW.ok_name;INSERT INTO shoelace_arrive VALUES ('sl3', 10);INSERT INTO shoelace_arrive VALUES ('sl6', 20);INSERT INTO shoelace_arrive VALUES ('sl8', 20);SELECT * FROM shoelace ORDER BY sl_name;insert into shoelace_ok select * from shoelace_arrive;SELECT * FROM shoelace ORDER BY sl_name;SELECT * FROM shoelace_log ORDER BY sl_name; CREATE VIEW shoelace_obsolete AS SELECT * FROM shoelace WHERE NOT EXISTS (SELECT shoename FROM shoe WHERE slcolor = sl_color); CREATE VIEW shoelace_candelete AS SELECT * FROM shoelace_obsolete WHERE sl_avail = 0;insert into shoelace values ('sl9', 0, 'pink', 35.0, 'inch', 0.0);insert into shoelace values ('sl10', 1000, 'magenta', 40.0, 'inch', 0.0);SELECT * FROM shoelace_obsolete;SELECT * FROM shoelace_candelete;DELETE FROM shoelace WHERE EXISTS (SELECT * FROM shoelace_candelete WHERE sl_name = shoelace.sl_name);SELECT * FROM shoelace ORDER BY sl_name;SELECT * FROM shoe ORDER BY shoename;SELECT count(*) FROM shoe;---- Simple test of qualified ON INSERT ... this did not work in 7.0 ...--create table foo (f1 int);create table foo2 (f1 int);create rule foorule as on insert to foo where f1 < 100do instead nothing;insert into foo values(1);insert into foo values(1001);select * from foo;drop rule foorule on foo;-- this should fail because f1 is not exposed for unqualified reference:create rule foorule as on insert to foo where f1 < 100do instead insert into foo2 values (f1);-- this is the correct way:create rule foorule as on insert to foo where f1 < 100do instead insert into foo2 values (new.f1);insert into foo values(2);insert into foo values(100);select * from foo;select * from foo2;drop rule foorule on foo;drop table foo;drop table foo2;---- Test rules containing INSERT ... SELECT, which is a very ugly special-- case as of 7.1. Example is based on bug report from Joel Burton.--create table pparent (pid int, txt text);insert into pparent values (1,'parent1');insert into pparent values (2,'parent2');create table cchild (pid int, descrip text);insert into cchild values (1,'descrip1');create view vview as select pparent.pid, txt, descrip from pparent left join cchild using (pid);create rule rrule as on update to vview do instead( insert into cchild (pid, descrip) select old.pid, new.descrip where old.descrip isnull; update cchild set descrip = new.descrip where cchild.pid = old.pid;);select * from vview;update vview set descrip='test1' where pid=1;select * from vview;update vview set descrip='test2' where pid=2;select * from vview;update vview set descrip='test3' where pid=3;select * from vview;select * from cchild;drop rule rrule on vview;drop view vview;drop table pparent;drop table cchild;---- Check that ruleutils are working--SELECT viewname, definition FROM pg_views WHERE schemaname <> 'information_schema' ORDER BY viewname;SELECT tablename, rulename, definition FROM pg_rules ORDER BY tablename, rulename;---- CREATE OR REPLACE RULE--CREATE TABLE ruletest_tbl (a int, b int);CREATE TABLE ruletest_tbl2 (a int, b int);CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (10, 10);INSERT INTO ruletest_tbl VALUES (99, 99);CREATE OR REPLACE RULE myrule AS ON INSERT TO ruletest_tbl DO INSTEAD INSERT INTO ruletest_tbl2 VALUES (1000, 1000);INSERT INTO ruletest_tbl VALUES (99, 99);SELECT * FROM ruletest_tbl2;-- Check that rewrite rules splitting one INSERT into multiple-- conditional statements does not disable FK checking.create table rule_and_refint_t1 ( id1a integer, id1b integer, primary key (id1a, id1b));create table rule_and_refint_t2 ( id2a integer, id2c integer, primary key (id2a, id2c));create table rule_and_refint_t3 ( id3a integer, id3b integer, id3c integer, data text, primary key (id3a, id3b, id3c), foreign key (id3a, id3b) references rule_and_refint_t1 (id1a, id1b), foreign key (id3a, id3c) references rule_and_refint_t2 (id2a, id2c));insert into rule_and_refint_t1 values (1, 11);insert into rule_and_refint_t1 values (1, 12);insert into rule_and_refint_t1 values (2, 21);insert into rule_and_refint_t1 values (2, 22);insert into rule_and_refint_t2 values (1, 11);insert into rule_and_refint_t2 values (1, 12);insert into rule_and_refint_t2 values (2, 21);insert into rule_and_refint_t2 values (2, 22);insert into rule_and_refint_t3 values (1, 11, 11, 'row1');insert into rule_and_refint_t3 values (1, 11, 12, 'row2');insert into rule_and_refint_t3 values (1, 12, 11, 'row3');insert into rule_and_refint_t3 values (1, 12, 12, 'row4');insert into rule_and_refint_t3 values (1, 11, 13, 'row5');insert into rule_and_refint_t3 values (1, 13, 11, 'row6');create rule rule_and_refint_t3_ins as on insert to rule_and_refint_t3 where (exists (select 1 from rule_and_refint_t3 where (((rule_and_refint_t3.id3a = new.id3a) and (rule_and_refint_t3.id3b = new.id3b)) and (rule_and_refint_t3.id3c = new.id3c)))) do instead update rule_and_refint_t3 set data = new.data where (((rule_and_refint_t3.id3a = new.id3a) and (rule_and_refint_t3.id3b = new.id3b)) and (rule_and_refint_t3.id3c = new.id3c));insert into rule_and_refint_t3 values (1, 11, 13, 'row7');insert into rule_and_refint_t3 values (1, 13, 11, 'row8');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -