返回首页

gbase数据、南大通用产品文档:GBase8a

更新日期:2024年09月11日

修改列
使用表设计器可以对表的现有列进行修改。
在对象资源管理器中,在对象资源管理器中,依次展开“服务器”、“数
据库”、“表”、“列”节点,右键需要修改的列,再点击“修改”。
可以分别修改列名、数据类型、长度、允许为空等值。
保存之后列即修改成功。

No such column name
指定的列名不存在。请确保该列名是正确的。

FOR EACH ROW 触发操作对触发语句所作用的每一个行执行一次。例如,如果触发语句
有下列语法,将对 manu_code列的值为 'KAR' 的 items 表中的每一行执行一次 FOR EACH
ROW 触发操作:
UPDATE items SET quantity = quantity * 2
WHERE manu_code = 'KAR';
如果触发事件不处理任何行,将不会执行 FOR EACH ROW 触发操作。
对于表上的触发器,如果触发事件为 SELECT 语句,那么该触发器称为选择触发器,并且
触发操作在完成时对检索到的行的所有处理之后再执行。但是,触发操作可能不会立即执
行;原因是会对查询返回的行的每一个实例执行 FOR EACH ROW 操作。例如,在带有
ORDER BY 子句的 SELECT 语句中,
必须先根据 WHERE 子句限定所有行,
它们才能排
序并返回。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 335 -

REFERENCING 子句
当创建 FOR EACH ROW 触发操作时,
通常必须在触发操作语句中指示您引用的是触发语
句生效之前还是之后的列值。例如:假定您想要跟踪对items 表的 quantity 列的更新。为此,
创建下表以记录该活动:
CREATE TABLE log_record
(item_num SMALLINT,
ord_num INTEGER,
username CHARACTER(8),
update_time DATETIME YEAR TO MINUTE,
old_qty SMALLINT,
new_qty SMALLINT);
要为此表中的 old_qty 和 new_qty 列提供值,必须能够引用 items 表中的 quantity 的旧值和
新值。即,触发语句作用之前和之后的值。REFERENCING 子句可使您做的这一点。
REFERENCING 子句允许您创建可与列名组合起来的两个前缀,一个用于引用列的旧值,
另一个用于引用列的新值。这些前缀称为相关名。可以根据您的要求创建一个或两个相关
名。您指出使用关键字 OLD 和 NEW 创建的哪个相关名。下面的 REFERENCING 子句
创建相关名 pre_upd 和post_upd 来引用行中的旧值和新值:
REFERENCING OLD AS pre_upd NEW AS post_upd
当更新 items 表中的某行中的 quantity 时,以下触发操作将在 log_record 中创建一行。
INSERT 语句引用 item_num 和 order_num 列的旧值并引用 quantity 列的新值和旧值。
FOR EACH ROW(INSERT INTO log_record
VALUES (pre_upd.item_num, pre_upd.order_num, USER,
CURRENT, pre_upd.quantity, post_upd.quantity));
在 REFERENCING 子句中定义的相关名应用于触发语句作用的所有行。
重要: 如果引用未被相关名限定的列名,数据库服务器不会专门在触发表的定义中搜索该列。
必须总是将相关名与 FOR EACH ROW 触发操作中的 SQL 语句中的列名结合使用,除非该语
句独立有效,而与触发操作无关。有关更多信息,请参阅《GBase 8s SQL 指南:语法》中的
CREATE TRIGGER 语句。

WHEN 条件
作为表上的触发器的选项,可在 WHEN 子句之前加上触发操作以使该操作依赖于测试结
果。WHEN 子句由关键字 WHEN 以及跟随在其后的括在圆括号中的条件语句所组成。在
CREATE TRIGGER 语句中,WHEN 子句跟在关键字 BEFORE 、AFTER 或 OR EACH
ROW 之后,触发操作列表之前。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 336 -

当 WHEN 条件存在时,如果它求值为 true,那么按触发操作的出现顺序执行这些操作。
如果 WHEN 条件求值为 false 或 unknown,那么不执行触发操作列表中的操作。如果触发
器指定 FOR EACH ROW,那么还将针对每一行对条件进行求值。
在下面的触发器示例中,仅当 WHEN 子句中的条件为 true (即,如果更新后单价高于更
新前单价的两倍)时才执行触发操作:
CREATE TRIGGER up_price
UPDATE OF unit_price ON stock
REFERENCING OLD AS pre NEW AS post
FOR EACH ROW WHEN(post.unit_price > pre.unit_price * 2)
(INSERT INTO warn_tab
VALUES(pre.stock_num, pre.manu_code, pre.unit_price,
post.unit_price, CURRENT));
有关 WHEN 条件的更多信息,请参阅《GBase 8s SQL 指南:语法》中的 CREATE
TRIGGER 语句。