【问题标题】:Rewrite Oracle Procedure and trigger for SQL Server为 SQL Server 重写 Oracle 过程和触发器
【发布时间】:2017-08-20 09:41:30
【问题描述】:

我有一个 Oracle 过程来向 JOB_HISTORY 表添加一行,以及一个触发器来在 table EMPLOYEES 中的两列( job_id, department_id) 上更新数据时调用该过程:我正在尝试为 Sql server 2008 重写它们,有人可以帮我重写它们吗?我可能已经用程序完成了它,但不能用触发器完成它。欢迎任何建议?

程序:

     CREATE OR REPLACE PROCEDURE add_job_history
     ( p_emp_id job_history.employee_id%type
    , p_start_date job_history.start_date%type
    , p_end_date job_history.end_date%type
    , p_job_id job_history.job_id%type
    , p_department_id job_history.department_id%type )
     IS BEGIN 
    INSERT INTO job_history (employee_id, start_date, end_date,job_id,department_id)
    VALUES(p_emp_id,p_start_date,p_end_date,p_job_id,p_department_id);
    END add_job_history;

触发器:

     CREATE OR REPLACE TRIGGER update_job_history 
     AFTER UPDATE OF job_id,department_id ON employees
     FOR EACH ROW
     BEGIN
     add_job_history(:old.employee_id, :old.hire_date, sysdate,
     :old.job_id,:old.department_id);
     END;

这就是我编写程序的方式,但我不确定是否与上述程序做同样的事情。

    CREATE PROCEDURE add_job_history
   (@p_emp_id         INTEGER,
    @p_start_date  DATE,
    @p_end_date   DATE,
    @p_job_id      VARCHAR(10),
    @p_department_id        INTEGER  ) AS
    BEGIN
    INSERT INTO job_history (employee_id, start_date, end_date, 
    job_id, department_id)
    VALUES(@p_emp_id, @p_start_date, @p_end_date,  @p_job_id,@p_department_id)
   END ;

【问题讨论】:

    标签: tsql stored-procedures sql-server-2008-r2 database-migration database-trigger


    【解决方案1】:
     CREATE TRIGGER update_job_history ON (table_EMPLOYEES)
     AFTER UPDATE
     AS
     BEGIN
    
     if exists(select 1 From inserted as i inner join deleted as d on d.employee_id = i.employee_id where d.job_id != i.job_id or d.department_id != i.department_id)
    
     begin
    
    insert into job_history (employee_id, start_date, end_date,job_id,department_id)
    select  d.employee_id, d.start_date,d.end_date,d.job_id,d.department_id
        from deleted as d
    
    
     end
    
     END;
    

    【讨论】:

    • 有些名字可能和你的不一样,但逻辑是这样的。
    • 感谢您的回复。我猜放两个“开始”和两个“结束”会给我带来问题。我收到错误消息:无法绑定多部分标识符“d.employee_id”和所有其他字段。当我删除查询末尾的“end”之一时,会出现一个错误,但仅在行最后一个“结束”
    • 这不是问题的根源,让我再看看这个
    • 我将连接条件更新为on d.employee_id = i.employee_id,您是否检查了我在脚本中编写的每个列/表名称?它可能会有所不同
    • @Fab 再次检查,之前存在语法错误。我更新了我的答案
    【解决方案2】:

    感谢您的帮助@Long 我找到了答案,即使我仍然需要测试它的逻辑并且我可能会更改一些插入的 i。与 d。

         create trigger update_job_history on employees
         after update
         as
         begin
         set nocount on;
         insert into job_history (employee_id, start_date, end_date  ,job_id,department_id)
         select i.employee_id,  i.hire_date as start_date , d.hire_date as  end_date, d.job_id ,d.department_id  
         From inserted as i inner join deleted as d on d.employee_id = i.employee_id where d.job_id != i.job_id or d.department_id != i.department_id
         end
    

    【讨论】:

      猜你喜欢
      • 2020-05-09
      • 1970-01-01
      • 2020-07-15
      • 2015-01-29
      • 2011-09-11
      • 2019-04-08
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      相关资源
      最近更新 更多