2014-05-09 68 views
0
SET @total_no_of_columns := (select count(*) FROM information_schema.COLUMNS c where c.TABLE_NAME = 'MyTableName' and c.TABLE_SCHEMA = 'TableSchema'); 

SET @iCNT = 1; 

    WHILE @iCNT<= @total_no_of_columns DO 
      SET @col_name := (SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'TableSchema' AND TABLE_NAME = 'MyTableName' AND ORDINAL_POSITION = @iCNT); 

       IF [email protected]_name <> [email protected]_name THEN 
        //Query to insert in audit table 
      END IF; 

      SET @iCNT = @iCNT + 1; 
    END WHILE; 

但是[email protected]_name <> [email protected]_name是錯誤的。
應該是什麼解決方案?如何從MySQL中動態獲取列名獲取OLD VALUE和NEW VALUE?

+0

問題是什麼? – gimg1

回答

0

在觸發器主體,OLD和NEW關鍵字,使您能夠訪問受觸發

INSERT觸發器中的行列,只有NEW.col_name可以使用。

在UPDATE觸發器中,可以使用OLD.col_name在更新之前引用行的列,並在NEW.col_name引用更新後的行的列。

在DELETE觸發器中,只能使用OLD.col_name;沒有新的行。

但新舊是其上已經present.But您對變量使用列中使用其impossible.still如果你想儲存在一個變量的值,然後你可以使用它

+0

謝謝Ajay。它是一個AFTER UPDATE觸發器 – PPP

+0

你有答案嗎? – Ajay

+0

沒有朋友。你可以看到我和Ravinder之間的對話,以便更好地理解我的問題。 – PPP

0

你必須緩衝區當前列名稱作爲先前的列名稱一旦被讀取。在下一次迭代中,將它與新讀取的列名進行比較。

更改您的代碼如下所示:

select count(*) INTO @total_no_of_columns 
    FROM information_schema.COLUMNS c 
where c.TABLE_NAME = 'MyTableName' 
    and c.TABLE_SCHEMA = 'TableSchema'; 

SET @iCNT = 1; 
SET @previous_column_name := ''; 

WHILE @iCNT<= @total_no_of_columns DO 
    SELECT COLUMN_NAME INTO @current_column_name 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_SCHEMA = 'TableSchema' 
    AND TABLE_NAME = 'MyTableName' 
    AND ORDINAL_POSITION = @iCNT; 

    IF @previous_column_name <> current_column_name THEN 
    -- Query to insert in audit table 

    -- lastly set current name to previous name 
    @previous_column_name := @current_column_name; 
    END IF; 

    SET @iCNT = @iCNT + 1; 
END WHILE; 
+0

謝謝Ravinder。但我想比較舊值和新值。假設在MyTable中有4列,如col1,col2,col3,col4。如果任何列的值已更改,我想插入審計表。我還需要存儲列名稱。你能幫我麼?這是一個AFTER UPDATE觸發器。 – PPP

+0

你可以顯示定義觸發器的表結構嗎? –

+0

表名:MyTable的 欄目有: COL1:INTEGER:主鍵 COL2:VARCHAR(45) COL3:DATETIME COL4:VARCHAR(10) – PPP

相關問題