我想创建一个触发器,以防止在numflights不存在的航班 ( )的预订表中插入。
Tables
----------------------------------------------
flights(numflight, origine, destination, dep, arr)
airports(code, city, country)
reservation(people, numflight, date_travel)
Run Code Online (Sandbox Code Playgroud)
列origine和destination包含机场代码。
我想询问您对在网站中使用 MySQL 触发器或事务的意见。
实际上我有一个payment带有 -的历史表UserId | OperationId | Comment | Credits | Sign (debit or credit)。所以每个支付操作都插入到这个表中。
但是,每次用户每次操作时,计算其总信用额度将是耗时的。所以我认为将每个用户的总信用金额保留在用户profile表中可能是一个好主意。
这是问题所在。我如何确保表中的总信用金额profile将与payment历史表中的操作保持同步?
我想使用两种方法:
哪个更靠谱?如果我有大型数据库(超过 100.000 个用户)怎么办?
你有什么建议来做到这一点吗?
BD MySQL 引擎是 InnoDB。
我有一个Object表,它是从另一个数据库的集成服务(如果需要,我可以更改)填充的。在某些时候,我们需要在另一个表中手动添加帖子,ObjectObjectGroup (ObjectId, ObjectGroupId)如果Object.ObjectType有某个整数值,则需要该表。由于集成服务不处理这种更新,我正在考虑向 Object 表添加一个触发器,其伪代码如下:
if Object.ObjectType = 10
begin
if Object.ObjectNumber like '<string pattern>'
begin
insert into ObjectObjectGroup values...
end
end
Run Code Online (Sandbox Code Playgroud)
这种设置是明智的,还是在性能方面有更好的方法?
当我插入表使用INSTEAD OF触发器,@@Identity,IDENT_CURRENT('Table')并SCOPE_IDENTITY()返回null。如何获取插入行的最后一个标识?
我们的 SQL Sever 2008 应用程序数据库从服务器 A 复制到服务器 B(推送复制)。我们使用服务器 B 上的副本(我们称之为 database_b)来创建报告并运行其他查询,以便我们的报告不会干扰应用程序。目前,我们利用低效的视图在 database_b 中跨多个表组合数据,以便为我们的报告编写者(具有基本 SQL 技能)简化报告编写。
99.9% 的数据库活动是 INSERTS,所以我们正在探索一种用我们可以优化的表替换低效视图的方法。这是一个简化的示例:
有一个appointment表和一个location(查找)表。每次安排新约会时,都会向appointment表中添加一行。每次这个 INSERT 发生时,我想把appointment_id它和它对应的位置名称(location_id从两个表连接)插入到一个报告表中。
我已经通过服务器 B 上 database_b 中的约会表上的触发器完成了此操作。
我的问题是 - 鉴于 database_b 是复制副本,是否有任何特殊考虑?我是否需要担心失败的触发器会破坏整个(推送)复制过程?还有什么我想念的吗?
不幸的是,在我们的开发环境中很难对此进行测试,因此我没有机会进行大量的反复试验。
是否有可能以某种方式定义全局可用的例程?似乎每个例程都必须在数据库范围内创建。
当我尝试从控制台创建一个例程(没有事先发布use dbname)时,我收到一个错误:
ERROR 1046 (3D000): No database selected
我们有大量相同的数据库(数据不同),目标是为某些表名创建一些触发器。但是我们只想运行一个例程,所以我们不必为每个数据库创建这些例程(因为它们是相同的,例程对每个数据库的工作方式相同)。
我运行PostgreSQL-9.2.4
是否可以从触发器调用 2 个函数?
假设以下触发器触发时,我有两个函数可以执行两个不同的表:
扳机:
CREATE TRIGGER start ON system_status FOR EACH ROW
WHEN ((new.event = start_task))
EXECUTE PROCEDURE ...()
Run Code Online (Sandbox Code Playgroud)
功能 1:( 当任务开始时 => 删除任何先前为此系统分配的下一个任务)
CREATE FUNCTION void_next_task() RETURNS trigger AS $$
BEGIN
DELETE FROM tasks_status ts
WHERE ts.system = NEW.system
AND ts.event = 'next_task';
RETURN NEW;
END;
$$
LANGUAGE plpgsql
Run Code Online (Sandbox Code Playgroud)
功能 2:(
如果插入的组合task和system已经出现在表中=> 将此组合标记为任何较早的记录deleted)
CREATE FUNCTION void_dup_task() RETURNS trigger AS $$
BEGIN
UPDATE system_status ss
SET deleted = 'TRUE'
WHERE ss.system …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个 Postgres 触发器,以确保在设置列的值后,它无法更新(基本上使其成为只读)。到目前为止,我已经提出了以下草案触发器。
1) 首先,我在正确的轨道上吗?
2) 有回报价值NEW吗?
3) 我必须original_id以NEW.?
CREATE FUNCTION check_id_change() RETURNS TRIGGER AS $$
BEGIN
IF OLD.original_id <> NEW.original_id THEN
RAISE EXCEPTION 'cannot change original_id';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER client_update_trigger AFTER UPDATE ON client FOR EACH ROW
EXECUTE PROCEDURE check_id_change();
Run Code Online (Sandbox Code Playgroud) 我无法让 INSTEAD OF 触发器正常工作,而且我想我误解了如何使用 NEW。考虑以下简化场景:
CREATE TABLE Product (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR
);
CREATE TABLE Purchase (
purchase_id SERIAL PRIMARY KEY,
product_id INT REFERENCES Product,
when_bought DATE
);
CREATE VIEW PurchaseView AS
SELECT purchase_id, product_name, when_bought
FROM Purchase LEFT JOIN Product USING (product_id);
Run Code Online (Sandbox Code Playgroud)
我希望能够创建INSTEAD OF触发器以允许我直接插入到 中PurchaseView,例如:
INSERT INTO Product(product_name) VALUES ('foo');
INSERT INTO PurchaseView(product_name, when_bought) VALUES ('foo', NOW());
Run Code Online (Sandbox Code Playgroud)
我的想法是这样的:
CREATE OR REPLACE FUNCTION insert_purchaseview_func()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO Purchase(product_id, when_bought) …Run Code Online (Sandbox Code Playgroud) 以前,我会将多个表合并为一个并返回结果,但在许多表中我有相同的列名。这就是为什么我决定用表名作为列名的前缀。但这打破了我必须自动更新我的updated_at专栏的触发器。
这是我的功能:
CREATE OR REPLACE FUNCTION update_updated_at()
RETURNS TRIGGER AS $$
BEGIN
NEW.updated_at = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
我会添加一个触发器,如:
CREATE TRIGGER update_users_updated_at
BEFORE UPDATE ON users
FOR EACH ROW EXECUTE PROCEDURE update_updated_at();
Run Code Online (Sandbox Code Playgroud)
但是现在我的专栏被命名了users_updated_at,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
trigger ×10
postgresql ×4
functions ×3
mysql ×3
plpgsql ×3
sql-server ×3
identity ×1
innodb ×1
performance ×1
replication ×1
syntax ×1
t-sql ×1
transaction ×1