我想制作一个触发器来记录任何更新的时间:
CREATE TRIGGER col_update
AFTER UPDATE ON col
FOR EACH ROW BEGIN
UPDATE col SET updated=NOW() WHERE id=NEW.id; // or OLD.id
END
Run Code Online (Sandbox Code Playgroud)
问题是当这个触发器尝试更新updated列时,它也是另一个更新事件,它运行触发器。这将创建一个无限循环,这是行不通的。
如何将更新时间存储在相应的列中?
我希望使用触发器,因为表中有很多列。如果我尝试手动设置更新时间,则需要修改许多查询。
我testtable在数据库testbase中创建了一个具有以下结构的表:
product_no (int, not null)
product_name (varchar(30), not null)
price (money, null)
expire_date (date, null)
expire_time (time(7), null)
Run Code Online (Sandbox Code Playgroud)
但是,如何编写触发器,以便它更新已修改(或使用新信息更新)的特定行,并将修改日期记录到expire_date字段中,并将修改时间记录到expire_time字段中?(或者如果这是可能的?)
此命令给出表的上次更新日期
SELECT UPDATE_TIME
FROM information_schema.tables
WHERE TABLE_SCHEMA = 'MyDB'
AND TABLE_NAME = 'MyTable'
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,这不起作用。我的问题是有什么方法可以将列名传递给触发器并更新传递的列,还是有其他我不知道的方法?
在 PostgreSQL 9.5 中,我有表格中的列
prefix_last_modified timestamp without time zone NOT NULL DEFAULT (clock_timestamp() AT TIME ZONE 'UTC')
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种方法来设置在每次更新行时自动更新的最后修改的值,我发现这篇定义函数的好帖子:
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
NEW.modified = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
现在,我想知道是否有任何方法可以将列名传递给 PostgreSQL 函数并将其执行到NEW行?例如
CREATE OR REPLACE FUNCTION update_modified_column(varchar column)
RETURNS TRIGGER AS $$
BEGIN
NEW.column = now();
RETURN NEW;
END;
$$ language 'plpgsql';
Run Code Online (Sandbox Code Playgroud) 正如标题所说,我在“ON UPDATE CURRENT_TIMESTAMP”方面遇到了一些问题。这是表的 SQL 定义:
CREATE TABLE `judgements` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`parent_id` bigint(20) NOT NULL DEFAULT '0',
`entry_id` bigint(20) NOT NULL,
`group_id` bigint(20) NOT NULL,
`comments` longtext,
`rating` int(11) DEFAULT '0',
`status` int(11) NOT NULL DEFAULT '1',
`modified` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`,`entry_id`,`group_id`),
KEY `group_id` (`group_id`),
KEY `entry_id` (`entry_id`),
KEY `status_id` (`status`),
CONSTRAINT `entry_id` FOREIGN KEY (`entry_id`) REFERENCES `entries` (`id`),
CONSTRAINT `group_id` FOREIGN KEY (`group_id`) REFERENCES `groups` (`id`),
CONSTRAINT `status_id` …Run Code Online (Sandbox Code Playgroud) 我有这张桌子:
我正在尝试创建一个更新触发器,每当对or列执行更新时,该触发器就会更新last_updated_on = GETDATE()和last_updated_by = SYSTEM_USER列。step_numberstep_name
我开始创建它
ALTER TRIGGER tr_app_bread_crumbs_afterupdate
ON [dbo].[app_bread_crumbs]
AFTER UPDATE
AS
BEGIN
UPDATE [dbo].[app_bread_crumbs]
SET last_updated_by = SYSTEM_USER,
last_updated_on = GETDATE()
END
Run Code Online (Sandbox Code Playgroud)
但这将一次更新所有行。我正在尝试弄清楚如何指定仅更新last_updated_on和last_updated_by由正在更新的特定行的触发器。
例如,如果他们更新:
UPDATE [dbo].[app_bread_crumbs]
SET step_name = 'DAMAGE' WHERE step_number = 1
Run Code Online (Sandbox Code Playgroud)
触发器应该只更新第一行
trigger sql-server t-sql sql-server-2012 row-modification-time
SQL Server 2012。
每当我的表中的记录发生更改时,我都需要使用当前日期和时间更新列 [LastUpdated]。目前我有:
CREATE TRIGGER Trig_LastUpdated ON Contact AFTER UPDATE
AS
SET NOCOUNT ON
UPDATE ct
SET LastUpdated = GETDATE()
FROM Contact ct
INNER JOIN Inserted i
ON ct.IDContact = i.IDContact
Run Code Online (Sandbox Code Playgroud)
但这是递归的,我不希望这样,会导致死锁和其他奇怪的事情。我无法全局关闭递归触发器。我看到 INSTEAD OF 触发器是非递归的,但是如果我这样做,我是否必须检查 Inserted 中的所有其他列以查看它是否已更新,或者 SQL Server 是否会为我处理?做到这一点的最佳方法是什么?
trigger sql-server deadlock sql-server-2012 row-modification-time
我在问是否可以在 MySQL 中仅导出在一段时间内修改的行,例如在过去一个月中修改的行,如果可能,如何?
我想更改一个表以包含modified和created列。但是,我在添加modified列时遇到了问题。我收到以下错误:
SQL 错误:ORA-00907:缺少右括号 00907. 00000 - “缺少右括号”
我正在阅读此 Oracle 文档(http://docs.oracle.com/cd/E17952_01/refman-5.5-en/timestamp-initialization.html)以获取有关如何正确编写ON UPDATE语法的示例
这是我的 SQL。
ALTER TABLE FOOBAR
ADD (
created TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL,
modified TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Run Code Online (Sandbox Code Playgroud)
为什么会出现缺少右括号的错误?
好的,所以我试图在最初插入记录时将特定记录中的列更新为 CURRENT_TIMESTAMP。这就是我所拥有的,否则我就迷路了。
CREATE TRIGGER dbo.TrgUpnInsert
ON [CNLH Security Authentication].dbo.DateTimestamp
AFTER INSERT,
INSERT INTO [CNLH Security Authentication].dbo.EntranceInformation (DateTimestamp) Values (CURRENT_TIMESTAMP);
Run Code Online (Sandbox Code Playgroud) trigger ×7
mysql ×4
sql-server ×3
postgresql ×2
t-sql ×2
timestamp ×2
backup ×1
deadlock ×1
functions ×1
mysql-5.5 ×1
mysqldump ×1
oracle-11g ×1
plpgsql ×1
update ×1