我有一个有 4 列的表qty,qtydiff,price和value。
我想要after update trigger在 qty 行值更改(多于一行)时触发。
该Before trigger应阅读,并从数量存储旧值和触发后应从新的价值上减去旧值qty列,在得到差值qtydiff繁衍与price列和更新的结果在value列。
下面的代码只是我还没有测试过的概念代码,我不确定它是否有效,但是有没有办法让更新前后在同一个触发器中工作?
CREATE TRIGGER [dbo].[Price_Modified]
ON [dbo].[STOCK]
BEFORE UPDATE ON STOCK
AS BEGIN
SET NOCOUNT ON;
IF UPDATE (Qty)
BEGIN
SELECT qty
FROM STOCK
END
AFTER UPDATE
AS BEGIN
SET NOCOUNT ON;
IF UPDATE (Qty)
BEGIN
UPDATE Stock
SET value = price * qtydiff
FROM STOCK
WHERE qtydiff = oldvalue - …Run Code Online (Sandbox Code Playgroud) 我想在 postgresql 中为一个表创建一个触发器。我的表包含有关事件的数据,包括房间号、开始时间和事件持续时间。在新插入表时,我想检查新事件的房间号在新事件发生时是否会很忙。如果是这样,那么我想引发异常,否则将新事件插入表中。我想将触发器声明为instead of触发器,insert但 postgres 不允许在表instead of上insert操作触发器(我不想只为触发器创建视图)。
我该如何解决这个问题?理论上我可以创建一个after触发器,然后检查新插入的数据是否有效,如果无效则删除。但这在概念上似乎是错误的方法,实际上也可能是错误的(我不确定触发器是否是原子的,也许有人可能已经根据错误的数据做出了错误的决定)。
这是表定义:
create table room_schedule(
start_date date,
start_time time,
room_no int,
event_id int,
duration interval,
primary key(start_date, start_time, room_no, event_id)
);
Run Code Online (Sandbox Code Playgroud)
这是我的触发器和函数定义:
create or replace function inserttrigfunc() returns trigger as $$
declare count int;
begin
with end_time_table(eid, stime, etime) as (
select event_id, start_time, (start_time + duration) as etime from room_schedule
where room_no=new.room_no
),
overlapping_time_table(eid, stime, etime) as(
select * from end_time_table
where …Run Code Online (Sandbox Code Playgroud) 我正在从 PostgreSQL 表中删除 750k 行中的 130k。
第一次,花了8个小时才完成删除查询。
第二次,我向表中添加了一个索引,并重建了该索引。现在用了3个小时完成删除查询
第三次,我添加了以下行:
alter table contact disable trigger ALL;
delete from contact where ....;
alter table contact enable trigger ALL;
Run Code Online (Sandbox Code Playgroud)
删除行花了不到一秒钟的时间。即使没有与当前和外键表关联的触发器。
即使没有与表关联的触发器,这种快速查询性能的原因可能是什么?数据库级别还有其他类型的触发器吗?
我创建了以下触发器:
CREATE TRIGGER probeer2
AFTER INSERT ON libtn01leb.kofax_release
FOR EACH ROW
UPDATE libtn01leb.kofax_release SET RRNR='bleh'
Run Code Online (Sandbox Code Playgroud)
此触发器将更新表中的每一行,而不是我当前添加的行。我怎样才能让它只对我插入的行有效?
上周,我发现我after insert or update trigger没有工作。在我禁用并启用它后,它又开始工作了。
我还不知道它为什么停止工作。有什么办法可以解决这个问题吗?因为此触发器正在记录日常作业的值,并用于报告目的。如果这个触发器在没有我通知或错误的情况下在几天内消失,我将陷入困境。
我正在使用 Oracle 10g,使用 sqldeveloper 访问数据库
My Trigger
create or replace
TRIGGER MASTER.INSTANCE_STEP_TRG
AFTER INSERT OR UPDATE OF SYSID,STEP_ID,INSTANCE_ID,PARENT_STEP_ID ON MASTER.WF_INSTANCE_STEP
REFERENCING OLD AS old NEW AS new
FOR EACH ROW
WHEN (new.sysid > 0)
declare
stepSysid number;
crCode varchar(50);
crDate date;
step_id number;
BEGIN
step_id := :new.step_id;
select ss.sysid into stepSysid from TEMPLATE.wf_step ws
inner join TEMPLATE.step_stage ss on ss.sysid=ws.stage_id
where ws.sysid= step_id;
if ( stepSysid>0) then
insert into MASTER.fact_cr_progress values(0,:new.instance_id,stepSysid,:new.create_dt);
end …Run Code Online (Sandbox Code Playgroud) 我有一个 MSSQL Server 2008 数据库。
我的数据库中有一些表,如下所示:
table1, table2, table3, ....
每个表都有一个 NVARCHAR(50) 字段 ( Name)
现在,我想更改每个 sql 查询在该字段中插入的字符串,
例如:
我们有想要在Name字段中插入“示例文本”的查询。
我想使用 SQL 触发器将其更改为“示例名称”
是否可以使用 sql 触发器?如果是这样,如何?我对 T-SQL 很幼稚
有没有更好的方法可以用 SQL Server 做到这一点?
我一直在开发一个针对 MySQL 的应用程序,而一个新的开发服务器正在慢慢建立。新的开发服务器将使用 oracle,并且由于我们即将准备就绪,我想从主键中删除 auto_increment 属性,并模拟 Oracle 的序列。我好几年没用oracle了。
由于每个预插入触发器都会做同样的事情——从 *foo_sequence* 中获取表foo的下一个 id ,Oracle 是否允许实现某种形式的动态/词法触发?
任何提示、技巧或陷阱?
编辑 #1:1550 - 这不是一个频繁使用的应用程序。一次使用将导致在最大的事务中插入 13 次小的、简单的记录。并发性是未知的,但一个用户导致任何重要的锁饥饿的可能引擎盖是估计非常低的 IMO。
编辑 #2 1612:目的是在 mysql 中模拟 oracle 序列,然后在 oracle 上使用 oracle 序列。
解析度:
我对触发器很陌生,我遇到了一般问题。我想实现这一目标:
CREATE TABLE `searcharticles` (
`articleID` int(11) unsigned NOT NULL,
`ean` char(13) COLLATE utf8_unicode_ci DEFAULT NULL,
`manufacturerNumber` varchar(20) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`articleID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
CREATE TABLE `addresses` (
`articleID` int(11) unsigned NOT NULL,
`shop` enum('shop1','shop2') COLLATE utf8_unicode_ci NOT NULL,
`url` varchar(255) COLLATE utf8_unicode_ci NULL,
`status` tinyint(3) NOT NULL DEFAULT '0',
`createTime` datetime NOT NULL,
`updateTime` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`articleID`,`shop`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
Run Code Online (Sandbox Code Playgroud)
在searcharticles 中插入新行时,应填充表 …
USE [RF_WORLD]
GO
/****** Object: Trigger [dbo].[lastdeathtrigg] Script Date: 08/20/2012 10:52:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Mauro Tamm
-- =============================================
ALTER TRIGGER [dbo].[lastdeathtrigg]
ON [dbo].[tbl_pvporderview]
AFTER UPDATE
AS
IF (UPDATE(Death))
BEGIN
SET NOCOUNT ON;
DECLARE @userserial int;
SELECT @userserial ='serial' WHERE UPDATE(Death)
Insert INTO [RF_WORLD].[dbo].[lastdeath]
(serial)
VALUES (@userserial)
END
Run Code Online (Sandbox Code Playgroud)
where 部分是可疑的,它会像那样工作吗?本质上,如果它实际更新,我只需要它选择行序列值。
是否可以使用触发器监视角色和权限授予/撤销?我知道使用 Oracle 审计工具来做到这一点,但有趣的是可以使用触发器来做到这一点。
trigger ×10
oracle ×3
sql-server ×3
mysql ×2
postgresql ×2
audit ×1
c# ×1
db2 ×1
ddl ×1
foreign-key ×1
functions ×1
insert ×1
oracle-10g ×1
select ×1
syntax ×1
t-sql ×1
update ×1