原文地址: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 部分系列结束了。