我正在從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爲報告的目的。
任何援助非常感謝。
謝謝。
你可以嘗試明確指定選擇的列嗎?另外,您的選擇必須從'更新'表中讀取(這是更新後的記錄) – bdn02