SQL触发器UPDATE,INSERT案例子句

时间:2018-03-26 22:15:01

标签: sql sql-server triggers

创建SQL触发器的正确​​语法是什么,它更新另一个表更新或插入的值,以及一个字段,以指定它是UPDATE还是INSERT。

我想做的例子:

CREATE TRIGGER Table1_Trigger_Update_Insert 
ON Table1
AFTER UPDATE, INSERT
AS
    INSERT INTO Table2 (col1, col2, col3)
        SELECT 
            col1, col2,
            CASE WHEN {if it was an update} THEN 'UPDATE'
                 WHEN {if it was an insert} THEN 'INSERT'
            END
        FROM
            Table1

2 个答案:

答案 0 :(得分:0)

create or replace trigger table1_trigger_update_insert 
after update or insert or delete
on table1
for each row
declare
 v_operation varchar2(16) := '';
begin

    if inserting then
        v_operation := 'insert';
    elsif updating then
        v_operation := 'update';
    elsif deleting then
        v_operation := 'delete';

insert into table2 (col1, col2, col3)
select col1
      ,col2
      ,v_operation
from table1
..
..
..
..
end;
/

答案 1 :(得分:0)

(我根据用户之前的问题历史记录添加了标记,并假设SQL Server正在编写此答案。

未能引用inserted(和/或deleted)伪表的触发器已损坏。你当前的那个也没提到,但插入两者的引用使这很容易:

CREATE TRIGGER Table1_Trigger_Update_Insert 
ON Table1
AFTER UPDATE, INSERT
AS
    INSERT INTO Table2 (col1, col2, col3)
        SELECT 
            col1, col2,
            CASE WHEN EXISTS (SELECT * FROM deleted) THEN 'UPDATE'
                 ELSE 'INSERT'
            END
        FROM
            inserted

我们使用inserted而不是Table1来获取仅受INSERTUPDATE 影响的行。我们引用deleted来确定操作是UPDATE还是INSERT(如果我们无法检测到INSERT则默认为UPDATE,因为这些是UPDATE只有导致此触发器触发的可能操作

UPDATE的特定情况下检测inserted中断的特定逻辑会影响0行(这仍会导致触发器触发)。但幸运的是,在这种情况下,无论如何我们在table2中都会有0行,因此无论如何都不要将任何行插入Highcharts.chart('container', { chart: { type: 'area' }, xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] }, series: [{ data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4], color: '#ff0000', fillColor: '#ffffff', fillOpacity: 1 }] });