当前位置:早雪网网络学院编程文档数据库技术Postgresql → PostgreSQL7.0手册-程序员手册 -42. Postgres 规则系统

PostgreSQL7.0手册-程序员手册 -42. Postgres 规则系统

减小字体 增大字体 作者:不详  来源:supcode.com收集整理  发布时间:2005-7-23 12:21:48
做有一些负作用.其中之一就是在 Postgres 系统表里的视图的信息与一般表的信息完全一样.所以对于查询分析器来说,表和视图之间完全没有区别.它们是同样的事物--关系.这就是目前很重要的一点.
SELECT 规则如何工作
ON SELECT 的规则在最后一步应用于所有查询,哪怕给出的命令是一条  INSERT,UPDATE 或 DELETE.而且与其他(规则)有不同的语意,那就是它们在实地修改分析树而不是创建一个新的(分析树).所以我们先介绍 SELECT 的规则. 
目前,这里只可能发生一个动作(action)而且它必须是一个 INSTEAD (取代了)的 SELECT 动作.有这个限制是为了令规则安全到普通用户也可以打开它们,并且它对真正的视图规则做 ON SELECT 规则限制. 

本文档的例子是两个联合视图,它们做一些运算并且会涉及到更多视图的使用.这两个视图之一稍后将利用对 INSERT,UPDATE 和 DELETE 操作附加规则的方法客户化,这样做最终的结果就会是这个视图表现得象一个具有一些特殊功能的真正的表.这可不是一个适合于开始的简单易懂的例子,从这个例子开始讲可能会让我们的讲解变得有些难以理解.但是我们认为用一个覆盖所有关键点的例子来一步一步讨论要比举很多例子搞乱思维好多了. 

在本例子中用到的数据库名是 al_bundy.你很快就会明白为什么叫这个名字.而且这个例子需要安装过程语言 PL/pgSQL ,因为我们需要一个小巧的 min() 函数用于返回两个整数值中的小的那个.我们用下面方法创建它 

    CREATE FUNCTION min(integer, integer) RETURNS integer AS
        'BEGIN
            IF $1 < $2 THEN
                RETURN $1;
            END IF;
            RETURN $2;
        END;'
    LANGUAGE 'plpgsql';
我们头两个规则系统要用到的真实的表的描述如下: 
    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
    );
我想我们都需要穿鞋子,因而上面这些数据都是很有用的数据.当然,有那些不需要鞋带的鞋子,但是不会让 AL 的生活变得更轻松,所以我们忽略之. 
视图创建为 

    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,
               min(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;
用于 shoelace 的 CREATE VIEW 命令(也是我们用到的最简单的一个)将创建一个关系/表 -- 鞋带(relation shoelace )并且在 pg_rewrite 表里增加一个记录,告诉系统有一个重写规则应用于所有索引了鞋带关系(relation shoelace)的查询.该规则没有规则资格(将在非 SELECT 规则讨论,因为目前的 SELECT 规则不可能有这些东西)并且它是 INSTEAD (取代)型的.要注意规则资格与查询资格不一样!这个规则动作(action)有一个资格. 
规则动作(action)是一个查询树,实际上是在创建视图的命令里的 SELECT 语句的一个拷贝. 

注意:你在表 pg_rewrite 里看到的两个额外的用于 NEW 和 OLD 范围表的记录(因历史原因,在打印出来的查询树里叫 *NEW* 和 *CURRENT* )对 SELECT 规则不感兴趣.

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13]  下一页

[数据载入中...] [返回上一页] [打 印]