技术开发 频道

在DB2中使用SQL过程语言来操作触发器

    【IT168 技术文档】首先,触发器是与表相关联的对象,它定义了一些在 INSERT、UPDATE 或者是 DELETE 时自动发生的操作。下面是一些可能需要用到触发器的例子:

    当插入时,在允许插入操作发生之前验证或者操纵数据。
    当更新时,通过比较新值与原值来验证操作的正确性。如果您用表中的一列来存储状态信息并且希望定义有效的状态转换时,这样做特别有用。
    执行删除操作之后,自动地将日志信息插入另一个用于审计追踪的表中。

    触发器能在数据库层面上可用于集中业务规则的实施,使所有的应用程序和用户不必再去检查数据的有效性。同样地,如果业务规则发生改变,这些改变在数据库层上就被集中了,而不需要通过所有正在执行的应用程序来传播。

    例子

    为了说明上述功能,下面的例子为一个虚构的饰品公司的数据库创建表和触发器,该数据库保存了公司的订单和客户信息。要求实施以下业务规则:

    当该饰品公司接到订单时,订单的价格和客户未结帐的物料清单价格的总和不能超过提供给该客户的赊购最高限额。
    一份订单可以有几种状态:PENDING、CANCELLED、SHIPPED、DELIVERED 和 COMPLETED。只有以下状态转换才是合法的:

    PENDING -> SHIPPED -> DELIVERED
    -> COMPLETED
    PENDING -> CANCELLED

    只有当订单被取消后才能删除。同时,我们也要将删除的订单的信息记录到另一表中以备审计之用。

    我们将定义下面的表来说明这个例子。

create table customer_t ( cust_id INT NOT NULL PRIMARY KEY, company_name VARCHAR(100), credit DECIMAL(10,2)) create table product_t ( product_id INT NOT NULL PRIMARY KEY, product_name VARCHAR(100)) create table orders_t ( order_id INT NOT NULL PRIMARY KEY, cust_id INT NOT NULL, product_id INT NOT NULL, quantity INT NOT NULL, price DECIMAL(10,2) NOT NULL, status CHAR(9) NOT NULL, FOREIGN KEY (cust_id) REFERENCES customer_t, FOREIGN KEY (product_id) REFERENCES product_t) create table delete_log_t ( Text varchar(1000))

     我们还将定义以下序列对象(DB2 UDB 7.2 中新增的)来生成唯一的 ID:

create sequence cust_seq create sequence prod_seq create sequence ord_seq

    接下来,我们将插入下列数据:

insert into customer_t values (NEXTVAL FOR cust_seq, 'Nancys Widgets', 100) insert into product_t values (NEXTVAL FOR prod_seq, 'Blue Widgets')

    最后,我们将创建触发器来实施前面定义的业务逻辑,并解释该过程。

0
相关文章