2016-10-12 9 views
1

私はすべてのアクションをデータベースに保存するための監査テーブルを持っています。私はTestDetailsテーブルを持っていてINSERT、UPDATEトリガを作成します。更新トリガーはwindows7で正常に動作しており、INSERTトリガはwindows7で動作していません。しかし、私はWindowsの挿入トリガをテストするときは、8,10そのうまく動作します。私は次のようにクエリを含めました:挿入トリガーが機能していませんSQLite

CREATE TABLE TestDetails (
     ID   INTEGER  PRIMARY KEY AUTOINCREMENT 
            UNIQUE 
            NOT NULL, 
     Type VARCHAR (50), 
     CreatedDate DATETIME, ModifiedDate DATETIME, CreatedBy INT, ModifiedBy INT 
    ); 
    CREATE TABLE Audit (
     TableName VARCHAR (50), 
     ID  INT (10), 
     Type  VARCHAR (30), 
     CDT  DATETIME, 
     Changeset TEXT (800) 
    ); 

    INSERT TRIGGER : 
    CREATE TRIGGER TRGINS_TestDetails AFTER INSERT ON TestDetails FOR EACH ROW BEGIN INSERT INTO Audit(TableName,ID,Type,CDT,ChangeSet) VALUES('TestDetails', new.ID, 'INSERT',DATETIME('NOW'), 
    '<ChangeSet>' || 
    '<Id><New>' || new.Id || '</New>' || 
    '<Type><New>' || new.Type || '</New>' || 
'<CreatedDate><New>' || new.CreatedDate || '</New>' || 
'<CreatedBy><New>' || new.CreatedBy || '</New>' || 
'<ModifiedDate><New>' || new.ModifiedDate || '</New>' || 
'<ModifiedBy><New>' || new.ModifiedBy || '</New>' || 
    || '</ChangeSet>'); END 


    UPDATE TRIGGER : 
    CREATE TRIGGER [TRGUPD_TestDetails ] 
      AFTER UPDATE 
       ON TestDetails 
    BEGIN INSERT INTO Audit (TableName, ID,Type, CDT, ChangeSet) 
           VALUES ('TestDetails', new.ID,'UPDATE',DATETIME('NOW'), 
            '<ChangeSet>' || CASE WHEN old.Id <> new.Id THEN '<Id><Old>' || old.Id || '</Old><New>' || new.Id || '</New>' ELSE '' END || CASE WHEN old.Type <> new.Type THEN '<Type><Old>' || old.Type || '</Old><New>' || new.Type || '</New>' ELSE '' END || 
CASE WHEN old.CreatedDate <> new.CreatedDate THEN '<CreatedDate><Old>' || old.CreatedDate || '</Old><New>' || new.CreatedDate || '</New>' ELSE '' END || 
CASE WHEN old.ModifiedDate <> new.ModifiedDate THEN '<ModifiedDate><Old>' || old.ModifiedDate || '</Old><New>' || new.ModifiedDate || '</New>' ELSE '' END || 
CASE WHEN old.CreatedBy <> new.CreatedBy THEN '<CreatedBy><Old>' || old.CreatedBy || '</Old><New>' || new.CreatedBy || '</New>' ELSE '' END || 
CASE WHEN old.ModifiedBy <> new.ModifiedBy THEN '<ModifiedBy><Old>' || old.ModifiedBy || '</Old><New>' || new.ModifiedBy || '</New>' ELSE '' END || 
'</ChangeSet>' );END; 

Audit : 
TableName  ID  Type CDT      ChangeSet 
TestDetails 1 INSERT 2016-10-12 09:03:00 NULL 
TestDetails 1 UPDATE 2016-10-12 09:05:32 <ChangeSet><Type><Old>Type1</Old><New>Type11</New></ChangeSet> 

The actual value for Changeset in windows8,10 is : <ChangeSet><ID><New>1</New><Type><New>Type1</New></ChangeSet> 

誰でも私を解決するのを助けることができますか? ありがとうございます。

+0

ランを皆さんありがとう:私は、次のように私のトリガーを変更しました。 win7のインストール時にコードを確認してください。 – Serg

+0

@Serg win7で試したことがありません。 – KaviSuja

+0

あなたのSqliteツールとは何ですか? – Serg

答えて

0

私は解決策を見つけました。問題は、挿入中にModifiedDate、Modified Byを維持していないことです。トリガーでは、そのフィールドを維持する必要はありません。今

CREATE TRIGGER TRGINS_TestDetails AFTER INSERT ON TestDetails FOR EACH ROW BEGIN INSERT INTO Audit(TableName,ID,Type,CDT,ChangeSet) VALUES('TestDetails', new.ID, 'INSERT',DATETIME('NOW'), 
    '<ChangeSet>' || 
    '<Id><New>' || new.Id || '</New>' || 
    '<Type><New>' || new.Type || '</New>' || 
'<CreatedDate><New>' || new.CreatedDate || '</New>' || 
'<CreatedBy><New>' || new.CreatedBy || '</New>' 
    || '</ChangeSet>'); END 

その作業を... .. Win7の上SqlitebrowserでOK

関連する問題