我的要求是在患者出院后将患者的 EMR 数据移动到一组历史记录表中。我建议在放置放电标志的桌子上使用一个后触发器,检查标志上的新\旧值,以确保我只在标志最初设置为放电时才采取行动。编写 PHP 端的高级应用程序开发人员表示,在 PHP 中执行此操作至少比触发器快 4 倍。对我来说这没有任何意义,但我的背景是 SQL Server,而不是 MySQL,所以我正在向社区寻求帮助。
附加信息:即使在患者出院后,也大量使用装有出院标志的桌子。当前有 7 个窄表(总共约 70 列)可以通过触发器插入数据。
我需要将表名从触发器传递到过程。
ALTER TRIGGER [dbo].[Trg_ProjectCreation]
ON [dbo].[Projects]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
-- procedure call
exec Proc_Test @Tablename (not need to hardcode)
END
Run Code Online (Sandbox Code Playgroud)
我想知道有什么方法可以从触发器本身获取表名。我需要它是动态的,因为当表的名称更改时,我不想更改我的代码。
这就是场景。
在不同的机器上有两个 MySQL 服务器(S1、S2),每个服务器上都有一个数据库(DB1、DB2)。
我在 DB2 上有一个表 (T2),它需要从 DB1 上的另一个表 (T1) 中“获取”行。
我创建了一个临时表(基于 DB1 并在 DB2 上联合),因此当我在 T1 上插入符合某些要求的行时,我将复制到我的 DB1 临时表。
没关系。
使用 DB2 上的联合表,我得到了 T2 所需的行。
我假设 DB2 的联合临时表上的触发器可以将该行插入到 T2,但触发器永远不会触发。
有什么建议?
使用 SQL Server,是否存在一种从触发器内部审计触发它的 sql 的方法?
我需要知道在没有分析器的情况下通过数据库触发触发器的 SQL 查询。
谢谢
公平警告,我知道这不是最好的方法,但我正在尝试扩展一些现有代码而无需重写。
无论如何,我已经安装了两个 SQL Server 2012,一个在我的办公室本地,另一个在远程站点。远程站点的服务器为我的本地系统设置了链接服务器。
远程站点的应用程序将记录插入链接服务器上具有INSTEAD OF触发器的表中。该触发器的末尾有一个 select 语句,它返回一个整数值。如果我在 SSMS 的本地框上插入,我会得到整数作为输出。如果我在远程盒子上插入,我得到的只是1 row(s) affected.
无论如何我可以将触发器的输出传递回链接服务器还是我需要重写为存储过程?
以下文本基于评论中要求的澄清
所有连接都是在远程端的单个用户的安全上下文中进行的。如果我EXECUTE AS USER在本地服务器上使用插入而不是通过链接进行插入,则输出会按预期显示,因此这不是帐户的权限问题。
服务器选项是:
Collation Compatible=False
Data Access=True
RPC=True
RPC Out=True
Use Remote Collation=True
Collation Name=(blank)
Connection Timeout=0
Query Timeout=0
Distributor=False
Publisher=False
Subscriber=False
Lazy Schema Validation=False
Enable Promotion of Distributed Transaction=True
Run Code Online (Sandbox Code Playgroud) 我正在尝试编写一个 MySQL 触发器。我有两张这样的表:
Table A------------------------------Table B
order_id--------sku---------------order_id----order_#----sku_copy
568---------AAA---------------568---------2345
567---------BBB---------------567---------6789-------empty column
566---------CCC---------------566---------1234
Run Code Online (Sandbox Code Playgroud)
当客户进行购买时,每张表都会添加一条新记录。我已将列“sku_copy”添加到表 B,因此在创建新记录时不会填充它。
创建新记录时,我希望触发器将表 A 中的“sku”字段复制到表 B 中的“sku_copy”字段。但是,我遇到的问题是如何在触发器中构造以下条件。
如果:表 A 中的“order_id”与表 B 中的“order_id”匹配。然后:将表 A 记录中的“sku”复制到表 B 中具有匹配“order_id”的记录。数据应添加到表 B 'sku_copy'。
我正在使用以下 SQL 触发器,但在运行时出现此错误:
“#1363 - INSERT 触发器中没有 OLD 行”
这是触发器:
DELIMITER $$
CREATE TRIGGER trigger_name
AFTER INSERT ON tableA
FOR EACH ROW BEGIN
INSERT INTO tableB
SET sku_copy = OLD.sku,
order_id = OLD.order_id,
order = OLD.order;
END $$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
有人可以告诉我如何更正此代码中的错误或提出更好的建议吗?
感谢您提供的任何帮助。
这是一个更新:
我试过这个触发器(这是实时数据而不是上面例子中的简化)但得到一个错误代码:
“#1064 - 您的 SQL 语法有错误;请检查与您的 MySQL 服务器版本相对应的手册,以了解在第 …
我知道TRIGGERs 很有用,因为它们负责后续查询,但是从性能的角度来看,它们也有优势吗?
将两个或三个查询替换为
INSERT INTO table1 ...
UPDATE table2 ...
UPDATE table3 ...
Run Code Online (Sandbox Code Playgroud)
使用基于触发器的查询作为
INSERT INTO table 1
Run Code Online (Sandbox Code Playgroud)
带触发器
CREATE TRIGGER test
AFTER INSERT ON table1
FOR EACH ROW BEGIN
UPDATE table2 ... WHERE id=NEW.id;
UPDATE table3 ... WHERE id=NEW.id;
END
Run Code Online (Sandbox Code Playgroud)
我们仍然拥有相同性能的三个查询吗?我的意思是我们执行后续查询或执行TRIGGER是否重要?
如果我们使用 API(例如通过 PHP 进行查询)会怎样。后续查询是内部的,无需连接器/驱动程序。是否TRIGGER提高了性能?
附加信息:数据库是带有 innoDB 的 mysql 5.5。
我有一个奇怪的情况,从日志中看到:
Process 37278 waits for ExclusiveLock on advisory lock [16421,999999,12864385,2]; blocked by process 53807.
Process 53807 waits for ExclusiveLock on advisory lock [16421,999999,12864395,2]; blocked by process 37278.
Process 37278: SELECT * FROM zel_api.insert_event ($1 ,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24)
Process 53807: SELECT * FROM zel_api.insert_event ($1 ,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17,$18,$19,$20,$21,$22,$23,$24)",
"See server log for query details.",,,"SQL statement ""SELECT pg_advisory_xact_lock(999999, format('zel_event.%I', p_table_name)::regclass::oid::integer)""
Run Code Online (Sandbox Code Playgroud)
这本身就已经很奇怪了,因为看起来两个进程阻塞了同一个咨询锁,但实际上都不能抓住它。
尝试获取锁的函数如下:
CREATE OR REPLACE FUNCTION zel_event.create_new_partition(
p_table_name text
)
RETURNS void AS
$BODY$
DECLARE
_schema text;
BEGIN
IF NOT EXISTS (table from catalog)
THEN
PERFORM …Run Code Online (Sandbox Code Playgroud) 我必须调查一个 MySQL 生产服务器,在调查时我发现一个DELETE查询的状态"SHOW PROCESSLIST"超过 400 秒preparing,我试图在慢日志中找到查询,但我无法在慢日志中找到查询。
mysql> show full processlist;
+------+-----------------+---------------------+-----------+---------+------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+------+-----------------+---------------------+-----------+---------+------+-----------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 2 | event_scheduler | localhost | NULL | Daemon | 204 | Waiting for next activation | NULL |
| 7229 | root | 192.168.1.178 | mydb | Connect | 204 | preparing | DELETE
FROM TEST_DATA_1
WHERE ID in
(SELECT ID
FROM …Run Code Online (Sandbox Code Playgroud) 使用触发器时,如果对表进行了更新,则执行触发器。这是非常方便的。但是,我需要的是执行外部脚本。
是否可以配置 MySQL,以便在触发/更改表中的值时执行外部进程/脚本?
trigger ×10
mysql ×5
mysql-5.5 ×2
performance ×2
sql-server ×2
deadlock ×1
functions ×1
linux ×1
postgresql ×1
remote ×1
t-sql ×1