远程数据库中的表

您无法在驻留于当前数据库之外的表或视图上创建触发器。但是,您可以在本地表上定义触发器,该表的触发操作操纵了本地服务器实例的另一个数据库中的表,或另一个服务器实例的数据库中的表。

以下示例在本地 GBase 8s 服务器实例 dbserver1 (它的会话是已连接的)的当前数据库中的 newtab 表上定义了 Update 触发器。此处触发操作在远程 dbserver2 GBase 8s 服务器实例的数据库中的 items 表上指定了 UPDATE 操作:
CREATE TRIGGER upd_nt UPDATE ON newtab
        REFERENCING NEW AS post
        FOR EACH ROW(UPDATE stores_demo@dbserver2:items 
        SET quantity = post.qty WHERE stock_num = post.stock 
        AND manu_code = post.mc);
总之,存在于本地数据库中的触发器支持本地、跨数据库和跨服务器的触发操作:

定义在远程服务器实例的数据库上的触发器的跨服务器触发操作可以是激活本地数据库中的一个或多个触发器的事件,本地触发器的触发操作不能是跨服务器操作。如果来自远程数据库服务器的 SELECT 、DELETE 、INSERT 、MERGE 或 UPDATE 语句是激活本地触发器(其操作指定了远程数据库实例的数据库的表)的事件,则触发操作失败。

例如,以下触发操作的组合和触发语句在触发语句执行时产生错误:
-- Trigger action from dbserver1 to dbserver3:
        CREATE TRIGGER upd_nt UPDATE ON newtab
        REFERENCING NEW AS post
        FOR EACH ROW(UPDATE stores_demo@dbserver3:items 
        SET quantity = post.qty WHERE stock_num = post.stock 
        AND manu_code = post.mc);
        
        -- Triggering statement from dbserver2:
        UPDATE stores_demo@dbserver1:newtab 
        SET qty = qty * 2 WHERE s_num = 5 
        AND mc = 'ANZ'; 
      
以上的 UPDATE 语句在运行时不会返回错误,因为跨服务器的触发事件不会触发另一个跨服务器操作。
重要: 作为安全预防措施,用户仅保留角色的自由访问权,不能通过视图或触发器通过对单独去数据库外表的访问。跨数据库触发操作和跨除雾器触发操作需要非本地数据库和直接授权给用户或者授权到 PUBLIC 组的表的存取权限。