1

J'ai une procédure Oracle pour ajouter une ligne à la table JOB_HISTORY et un déclencheur pour appeler la procédure lorsque les données sont mises à jour sur deux colonnes (job_id, department_id) dans le table EMPLOYEES: J'essaie de les réécrire pour Sql Server 2008, quelqu'un peut-il m'aider à réécrire les deux s'il vous plaît? J'aurais pu le faire avec la procédure mais je ne peux pas le faire avec le déclencheur. toute suggestion est la bienvenue?Réécriture Oracle Procédure et déclencheur pour SQL Server

Procédure:

 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; 

Trigger:

 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; 

Voici comment je l'ai écrit la procédure je ne sais pas fait la même chose que celle ci-dessus cependant.

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 ; 

Répondre

0
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; 
+0

certains noms peuvent ne pas être identiques aux vôtres, mais la logique est telle qu'elle est. – LONG

+0

merci pour la réponse. Mettre deux "début" et deux "fin" me donne des problèmes je suppose. Je reçois l'erreur: L'identifiant en plusieurs parties "d.employee_id" et tous les autres champs ne peuvent pas être liés. Lorsque je supprime l'un des "end" à la fin de la requête me donne une erreur, mais seulement à la ligne de la dernière "fin" – Fab

+0

qui n'est pas la source de problème, laissez-moi jeter un oeil dans ce nouveau – LONG

0

Merci pour votre aide @Long Je trouve la réponse même si je dois encore tester la logique de celui-ci et je pourrais modifier certains insérés i. avec 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