2016-01-29 158 views
1

我正在從Oracle 9i數據庫遷移到SQL Server,並試圖解決和翻譯我們必須維護的一個觸發器記錄的歷史。 History表有其自己的ID列,其他所有列與Current表中的相同。SQL Server:在「當前」表更新爲「歷史」表時創建一個觸發器

這裏是我的觸發如從ORADB:(在ORADB我們使用的是順序遞增的「歷史」 PK)

CREATE OR REPLACE TRIGGER "RC_CURRENT_T" 
BEFORE INSERT OR UPDATE 
ON RC_CURRENT 
FOR EACH ROW 

    DECLARE var_date VARCHAR2(30 BYTE); 
    BEGIN 
    IF UPDATING THEN 
     var_date:=TO_CHAR(CURRENT_DATE, 'MM/DD/YYYY HH24:MI:SS'); 
     INSERT 
     INTO RC_HISTORY 
     (
      "ID" , 
      REC_ID , 
      STATUS_DESCR , 
      REQBY_FULLNAME , 
      REQBY_USERNAME , 
      REQBY_EMAIL , 
      REQBY_EMPLID , 
      PCARD_TYPE , 
      BUS_SGMT_DESCR , 
      REQ_TYPE , 
      REQ_CHNGAUTHBY , 
      OP_CNTR_NAME , 
      CARDHOLDER_NAME , 
      CUSTODIAN_NAME , 
      ED_ROLLUP_NUM , 
      CARDHOLDER_ADDRESS , 
      CARDHOLDER_CITY , 
      CARDHOLDER_STATE , 
      CARDHOLDER_ZIP , 
      CARD_NUMBER , 
      GL_CODE , 
      GL_LOCATION , 
      GL_DEPARTMENT , 
      GL_ACCOUNT , 
      GL_SVCSCODE , 
      MONTH_LIMIT , 
      LIMIT_RESTRICTIONS , 
      CARD_LIMIT , 
      REASON_COMMENTS , 
      CREATE_DATE , 
      APPROVER1_NAME , 
      APPROVER1_USERNAME , 
      APPROVER1_EMAIL , 
      APPROVER1_EMPLID , 
      APPROVER1_DATE , 
      APPROVER2_NAME , 
      APPROVER2_USERNAME , 
      APPROVER2_EMAIL , 
      APPROVER2_EMPLID , 
      APPROVER2_DATE , 
      ADMIN_LVL1 , 
      ADMIN_LVL2 , 
      ADMIN_LVL3 , 
      ADMIN_LVL4 , 
      ADMIN_LVL5 , 
      ADMIN_LVL6 , 
      KEYED_DATE , 
      KEYED_BY_NAME , 
      KEYER_CHANGE_TYPE , 
      KEYER_COMMENTS , 
      CARD_STATUS , 
      KEYER_USERNAME , 
      KEYER_EMPLID , 
      USER_FULLNAME, 
      OPER_STREET, 
      OPER_CITY, 
      OPER_STATE, 
      OPER_ZIP, 
      USER_PHONE, 
      USER_EMAIL, 
      USER_HYCHY_SETUP, 
      USER_ASSIGNED_USERID, 
      USER_PROCESS_DATE, 
      USER_DISTRIBUTION, 
      USER_REQUESTTYPE, 
      REC_ENTRY_DATE 
     ) 
     VALUES 
     (
      RC_HISTORY_SEQ.nextval , 
      :OLD.REC_ID , 
      :OLD.STATUS_DESCR , 
      :OLD.REQBY_FULLNAME , 
      :OLD.REQBY_USERNAME , 
      :OLD.REQBY_EMAIL , 
      :OLD.REQBY_EMPLID , 
      :OLD.PCARD_TYPE , 
      :OLD.BUS_SGMT_DESCR , 
      :OLD.REQ_TYPE , 
      :OLD.REQ_CHNGAUTHBY , 
      :OLD.OP_CNTR_NAME , 
      :OLD.CARDHOLDER_NAME , 
      :OLD.CUSTODIAN_NAME , 
      :OLD.ED_ROLLUP_NUM , 
      :OLD.CARDHOLDER_ADDRESS , 
      :OLD.CARDHOLDER_CITY , 
      :OLD.CARDHOLDER_STATE , 
      :OLD.CARDHOLDER_ZIP , 
      :OLD.CARD_NUMBER , 
      :OLD.GL_CODE , 
      :OLD.GL_LOCATION , 
      :OLD.GL_DEPARTMENT , 
      :OLD.GL_ACCOUNT , 
      :OLD.GL_SVCSCODE , 
      :OLD.MONTH_LIMIT , 
      :OLD.LIMIT_RESTRICTIONS , 
      :OLD.CARD_LIMIT , 
      :OLD.REASON_COMMENTS , 
      :OLD.CREATE_DATE , 
      :OLD.APPROVER1_NAME , 
      :OLD.APPROVER1_USERNAME , 
      :OLD.APPROVER1_EMAIL , 
      :OLD.APPROVER1_EMPLID , 
      :OLD.APPROVER1_DATE , 
      :OLD.APPROVER2_NAME , 
      :OLD.APPROVER2_USERNAME , 
      :OLD.APPROVER2_EMAIL , 
      :OLD.APPROVER2_EMPLID , 
      :OLD.APPROVER2_DATE , 
      :OLD.ADMIN_LVL1 , 
      :OLD.ADMIN_LVL2 , 
      :OLD.ADMIN_LVL3 , 
      :OLD.ADMIN_LVL4 , 
      :OLD.ADMIN_LVL5 , 
      :OLD.ADMIN_LVL6 , 
      :OLD.KEYED_DATE , 
      :OLD.KEYED_BY_NAME , 
      :OLD.KEYER_CHANGE_TYPE , 
      :OLD.KEYER_COMMENTS , 
      :OLD.CARD_STATUS , 
      :OLD.KEYER_USERNAME , 
      :OLD.KEYER_EMPLID , 
      :OLD.USER_FULLNAME, 
      :OLD.OPER_STREET, 
      :OLD.OPER_CITY, 
      :OLD.OPER_STATE, 
      :OLD.OPER_ZIP, 
      :OLD.USER_PHONE, 
      :OLD.USER_EMAIL, 
      :OLD.USER_HYCHY_SETUP, 
      :OLD.USER_ASSIGNED_USERID, 
      :OLD.USER_PROCESS_DATE, 
      :OLD.USER_DISTRIBUTION, 
      :OLD.USER_REQUESTTYPE, 
      var_date 
     ) ; 
    END IF; 
    END; 

我試圖跟隨,但得到的錯誤信息

INSERT語句的選擇列表包含的項目少於
插入列表。 SELECT值的數量必須與INSERT 列的數量相匹配。

代碼:

CREATE TRIGGER RC_CURRENT_T 
ON [dbo].[RC_CURRENT] 
FOR UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [dbo].[RC_HISTORY] 
    ([REC_ID] 
    ,[STATUS_DESCR] 
    ,[REQBY_FULLNAME] 
    ,[REQBY_USERNAME] 
    ,[REQBY_EMAIL] 
    ,[REQBY_EMPLID] 
    ,[PCARD_TYPE] 
    ,[BUS_SGMT_DESCR] 
    ,[REQ_TYPE] 
    ,[REQ_CHNGAUTHBY] 
    ,[OP_CNTR_NAME] 
    ,[CARDHOLDER_NAME] 
    ,[CUSTODIAN_NAME] 
    ,[ED_ROLLUP_NUM] 
    ,[CARDHOLDER_ADDRESS] 
    ,[CARDHOLDER_CITY] 
    ,[CARDHOLDER_STATE] 
    ,[CARDHOLDER_ZIP] 
    ,[CARD_NUMBER] 
    ,[GL_CODE] 
    ,[GL_LOCATION] 
    ,[GL_DEPARTMENT] 
    ,[GL_ACCOUNT] 
    ,[GL_SVCSCODE] 
    ,[MONTH_LIMIT] 
    ,[LIMIT_RESTRICTIONS] 
    ,[CARD_LIMIT] 
    ,[REASON_COMMENTS] 
    ,[CREATE_DATE] 
    ,[APPROVER1_NAME] 
    ,[APPROVER1_USERNAME] 
    ,[APPROVER1_EMAIL] 
    ,[APPROVER1_EMPLID] 
    ,[APPROVER1_DATE] 
    ,[APPROVER2_NAME] 
    ,[APPROVER2_USERNAME] 
    ,[APPROVER2_EMAIL] 
    ,[APPROVER2_EMPLID] 
    ,[APPROVER2_DATE] 
    ,[ADMIN_LVL1] 
    ,[ADMIN_LVL2] 
    ,[ADMIN_LVL3] 
    ,[ADMIN_LVL4] 
    ,[ADMIN_LVL5] 
    ,[ADMIN_LVL6] 
    ,[KEYED_DATE] 
    ,[KEYED_BY_NAME] 
    ,[KEYER_CHANGE_TYPE] 
    ,[KEYER_COMMENTS] 
    ,[CARD_STATUS] 
    ,[KEYER_USERNAME] 
    ,[KEYER_EMPLID] 
    ,[USER_FULLNAME] 
    ,[OPER_STREET] 
    ,[OPER_CITY] 
    ,[OPER_STATE] 
    ,[OPER_ZIP] 
    ,[USER_PHONE] 
    ,[USER_EMAIL] 
    ,[USER_HYCHY_SETUP] 
    ,[USER_ASSIGNED_USERID] 
    ,[USER_PROCESS_DATE] 
    ,[USER_DISTRIBUTION] 
    ,[USER_REQUESTTYPE] 
    ,[REC_ENTRY_DATE] 
    ) 
    SELECT * FROM RC_CURRENT 
END 
GO 

我需要保持在歷史表中單獨的ID爲報告的目的。

任何援助非常感謝。

謝謝。

+0

你可以嘗試明確指定選擇的列嗎?另外,您的選擇必須從'更新'表中讀取(這是更新後的記錄) – bdn02

回答

0

看着舊的觸發器(和錯誤消息)RC_HISTORY有1個額外的字段相比,RC_CURRENT所以你有兩個選項。

  1. 如果[REC_ID]是自動遞增標識列,你可以簡單地從列的列表中刪除它插入到

    INSERT INTO [dbo].[RC_HISTORY] 
    ([STATUS_DESCR] 
    ,[REQBY_FULLNAME] 
    ,[REQBY_USERNAME] 
    ... 
    
  2. 如果[REC_ID]沒有被設置爲自動增量,那麼你將有以提供一個值,以插入到柱

    SELECT (SELECT MAX([REC_ID])+1 FROM RC_HISTORY), * FROM RC_CURRENT 
    

我建議你嘗試第一個選項,並將列設置爲身份列,如果它尚未,我也建議你也使用命名列而不是*選擇值。

+0

另外還有其他評論,我強烈建議您不要將日期存儲爲varchar。 oracle和sql server都有合適的數據類型來存儲日期。將數據存儲爲錯誤的數據類型是一種持續頭痛的方法,即使不是徹頭徹尾的災難。這是任何rdbms的基本設計缺陷。 – EdStevens

+0

謝謝你benni_mac_b和EdStevens。我繼續並明確輸入每一列。 REC_ID(key)是「Current」表的ID列,但「History」表具有自己的ID(key)列,REC_ID具有REC_ID上的Current(one) - > History(many)關係。 – acjohnson72

相關問題