这是我正在尝试做的事情:
当INSERT表格中有新内容时ACCOUNTS,我需要更新ACCOUNTSwhere pk=中的行,NEW.edit_on通过设置status='E'来表示特定(旧)帐户已被编辑.
DELIMITER $$
DROP TRIGGER IF EXISTS `setEditStatus`$$
CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS
FOR EACH ROW BEGIN
update ACCOUNTS set status='E' where ACCOUNTS.pk = NEW.edit_on ;
END$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)
要求不是我操纵新插入的列,而是操作已经存在的列pk = NEW.edit_on
但是,我无法更新同一个表: Can't update table ACCOUNTS ... already used by the statement that invoked this trigger
请建议一个解决方法
PS:我已经通过已经走在触发更新表上相同的表更新后,插入到相同的表触发的MySQL,在同一个表插入触发器后更新和对表后插入MySQL的触发器与插入和更新,但他们不似乎回答我的问题.
编辑 …
在我的MySQL数据库中,我有一些触发器ON DELETE和ON INSERT.有时我需要禁用一些触发器,我必须DROP例如
DROP TRIGGER IF EXISTS hostgroup_before_insert //
Run Code Online (Sandbox Code Playgroud)
并重新安装.是否有任何SET triggers hostgroup_before_insert = 0类似我们的外键快捷方式:
mysql> SELECT version();
+-------------------------+
| version() |
+-------------------------+
| 5.1.61-0ubuntu0.10.10.1 |
+-------------------------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
编辑答案MySQL中没有内置的服务器系统变量TRIGGER_CHECKS.
一个简单的解决方法是改为使用用户定义的会话变量.
#FALSE value overrides trigger type settings
SET @TRIGGER_CHECKS = [TRUE|FALSE];
SET @TRIGGER_BEFORE_INSERT_CHECKS = [TRUE|FALSE];
SET @TRIGGER_AFTER_INSERT_CHECKS = [TRUE|FALSE];
DELIMITER $$
DROP TRIGGER IF EXISTS `yearCheck_beforeInsert` $$
CREATE DEFINER=`root`@`localhost` TRIGGER `yearCheck_beforeInsert`
BEFORE INSERT ON `movies` FOR …Run Code Online (Sandbox Code Playgroud) 我使用SQL创建了一个触发器,如何在phpMyadmin中使用MySQL查看触发器?
我有一个带有“货币”列的表。我想阻止进一步插入某些货币,而不删除现有货币。
最初我正在考虑验证触发器。
然后我发现了NOT VALID的选项ALTER TABLE ADD CONSTRAINT,它阻止了现有数据的验证。
该文档似乎暗示该NOT VALID选项主要是出于性能原因,允许用户将验证推迟到以后。但没有任何地方明确表示它不能用于保留旧(无效)数据。
在这篇文章中,该人说:“您甚至可以将约束保留在某种NOT VALID状态中,因为这更好地反映了它的实际作用:检查新行,但不对现有数据提供保证。检查约束没有任何问题NOT VALID。 ”
那么,该NOT VALID选项可以用于此目的吗?或者制作一个验证触发器会更好吗?
我有一张桌子,我跟踪特定项目的费用.这些费用可能会随着时间的推移而变化,所以我有两列(startDate,endDate),当前的费用总是在不久的将来有一个endDate.我已经有一个触发器用于对输入的新行进行一些计算,但我想要发生的是如果我输入一个已经有条目的项目我想将前一个条目的endDate设置为前一天新条目的startDate和新的endDate到预定的远期日期.这是我首先尝试的代码:
CREATE
DEFINER=`root`@`%`
TRIGGER `im`.`splitBeforeIns`
BEFORE INSERT ON `im`.`split`
FOR EACH ROW
BEGIN
SET NEW.tcPercent = (NEW.tcOfficeFee / NEW.globalFee) * 100 , NEW.proPercent = 100 - NEW.tcPercent, NEW.endDate = 20501231;
UPDATE im.split set endDate = ADDDATE(NEW.startDate, -1) where procKey = NEW.procKey AND endDate = 20501231;
END$$
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
ERROR 1442: Can't update table 'split' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
Run Code Online (Sandbox Code Playgroud) 我正在使用PostgreSQL和pgAdmin,我无法使用触发器功能.但是,据我所知,你可以在PostgreSQL中返回类型触发器吗?
CREATE OR REPLACE FUNCTION validate_Cat()
RETURNS TRIGGER AS
$BODY$
BEGIN
-- CODE here
END;
$BODY$
LANGUAGE SQL;
CREATE TRIGGER validate_Cat
AFTER INSERT OR UPDATE ON Category
FOR EACH ROW execute procedure validate_Cat();
Run Code Online (Sandbox Code Playgroud) 我尝试使用以下代码创建触发器.
CREATE OR REPLACE TRIGGER MYTABLE_TRG
BEFORE INSERT ON MYTABLE
FOR EACH ROW
BEGIN
select MYTABLE_SEQ.nextval into :new.id from dual;
END;
Run Code Online (Sandbox Code Playgroud)
我收到了错误
Error(2,52): PLS-00049: bad bind variable 'NEW.ID'
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?谢谢.
在尝试创建名为的触发器时ghazal_current_bef_upd_row:
create trigger ghazal_current_bef_upd_row
before update on ghazal_current
for each row
when (new.Rating < old.Rating)
begin
insert into ghazal_current_audit
(GhazalName,Old_Rating,New_Rating)
values
(:old.GhazalName,:old.Rating,:new.Rating);
end;
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
Error report:
ORA-04089: cannot create triggers on objects owned by SYS
04089. 00000 - "cannot create triggers on objects owned by SYS"
*Cause: An attempt was made to create a trigger on an object owned by SYS.
*Action: Do not create triggers on objects owned by SYS.
Run Code Online (Sandbox Code Playgroud)
两个表命名ghazals_current,并ghazal_current_audit通过创建SYS.为什么我不能在创建的表上创建触发器 …
我有一个触发器,但我需要与我的postgres的所有表关联.下面有这样的命令吗?
CREATE TRIGGER delete_data_alldb
BEFORE DELETE
ON ALL DATABASE
FOR EACH ROW
EXECUTE PROCEDURE delete_data();
Run Code Online (Sandbox Code Playgroud) 是否可以使用 Entity Framework Core 创建 SQL 触发器。
也许通过使用指令
protected override void OnModelCreating(DbModelBuilder dbModelBuilder)
{
}
Run Code Online (Sandbox Code Playgroud)
或者简单地通过在迁移脚本中执行 SQL 语句
public override void Up()
{
}
Run Code Online (Sandbox Code Playgroud) database-trigger ×10
mysql ×4
postgresql ×3
database ×2
oracle ×2
plsql ×2
constraints ×1
oracle11g ×1
phpmyadmin ×1
plpgsql ×1
sql-server ×1
triggers ×1