暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

[译] 从 Sakila-MySQL 迁移到 Couchbase之触发器

原创 摸鱼王者 2022-06-28
270

原文地址:Migrating from Sakila-MySQL to Couchbase - Part 4: Triggers
原文作者: Isha Kandaswamy
译者:摸鱼王者

在 SQL 中,触发器是一个数据库对象,当数据库中发生事件(通常是诸如插入、更新或删除之类的更改)时触发。

Couchbase Eventing Service 是一个实时操作数据更改的框架。事件是由插入、更新和删除触发的 Couchbase 集群中的数据更改。在 couchbase 中,插入和更新事件都包含在 OnUpdate 函数调用中。

现在让我们看几个示例并将 MySQL 中的触发器映射到 Couchbase 事件函数。

插入和更新触发器和事件函数

为了在特定表中插入和更新值,在 mysql 中他们创建了 2 个触发器 - 一个插入触发器和一个更新触发器。在插入触发器中,采用旧值并将这些相同的值插入到新表中。对于更新触发器,对于film_old 表中每一行的更新,fim_new 表将使用相同的更改值进行更新。

插入和更新触发器实际上被分组到沙发库中称为 OnUpdate 的一个事件函数中,它更像是一个 upsert 操作(更新和插入)。如示例中所示,这个单一功能映射到 mysql 中的 2 个单独的触发器。

Sakila 的 SQL 触发器

DELIMITER ;; 
CREATE TRIGGER `insert_duplicate`   
AFTER INSERT ON `film_old`   
FOR EACH ROW BEGIN     
     INSERT INTO film_new (film_id, title, description)         
     VALUES (new.film_id, new.title, new.description);   
END;;    
     
CREATE TRIGGER `upd_duplicate` 
AFTER UPDATE ON `film_old` 
FOR EACH ROW BEGIN     
     IF (old.title != new.title) 
     OR (old.description != new.description)      
     OR (old.film_id != new.film_id)     
     THEN         
        UPDATE film_new             
        SET title=new.title,                 
        description=new.description,                 
        film_id=new.film_id         
        WHERE film_id=old.film_id;     
     END IF;   
END;;

Couchbase 事件功能

为 src_bucket 创建 2 个存储桶别名作为只读和 dst_bucket1 作为读写。

OnUpdate 函数使用 upsert 操作插入或更新每个文档的值,具体取决于值是否已存在,从源存储桶到目标存储桶。

function OnUpdate(doc, meta) {
    log("Doc created/updated", meta.id);
    try{
        var dst_doc = {};
        dst_doc["film_id"] = doc["film_id"];
        dst_doc["title"] = doc["title"];
        dst_doc[“description”] = doc[“description”];
        var result1= couchbase.upsert(dst_bucket,meta,dst_doc);
        log(result1);
    }catch(e){
        log("error:",e);
    }
}

删除触发器和事件函数

delete_duplicate 触发器在film_old 表上删除相应的行后复制film_new 上的所有DELETE 操作。同样在 Couchbase eventing 中,当文档在源存储桶中被删除时,会为目标存储桶触发事件功能。

Sakila 的 SQL 触发器

CREATE TRIGGER `delete_duplicate` 
AFTER DELETE ON `film_old` 
FOR EACH ROW BEGIN
    DELETE 
    FROM film_new 
    WHERE film_id = old.film_id;
END;;

Couchbase 事件功能

function OnDelete(){
    log("Doc deleted", meta.id);
    try {
            var this_film_id = meta.id;   
            var del = delete from `film_text` where film_id =
                     TONUMBER($this_film_id);
            del.execQuery();
            log('Deleted entry: ', this_film_id);
    }catch(e){
        log("error:",e);
    }
}

日期更改触发器

MySQL Sakila 示例中有 3 个日期更改触发器。customer_create_date 触发器、rental_date 触发器和 payment_date 触发器。所有这些都根据插入行的时间设置了一个带有当前时间、日期和时间戳的创建日期列。让我们以其中一个为例。

Sakila 的 SQL 触发器

CREATE TRIGGER `customer_create`
 AFTER INSERT ON `customer`
 FOR EACH ROW BEGIN
    SET new.create_date = NOW();
  END;;

在 couchbase 中,我们使用 new Date() 函数创建一个新的 Date()。

Couchbase 事件功能

function OnUpdate(doc, meta) {
    log("Doc created/updated", meta.id);
    try {
        src_bucket["create_date"] = new Date();
    } catch(e) {
        log("Error: ",e);
    }
}

正如我们所见,考虑到 Couchbase 提供的各种服务 - N1QL、索引、事件和导入/导出,从关系数据库迁移到 Couchbase 非常容易。

在此我们的讨论从 MySQL 中的 Sakila DB 迁移到 Couchbase 的 4 部分系列结束了。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论