2013-02-05 13 views
2

當我們在表格中插入或更新數據時,我希望將主鍵和表格名稱插入到另一個表格中。
我需要在今天結束時調和所有今天更新的表。僅在數據庫觸發器不是表格

請建議。謝謝。

+0

您需要每個表一個觸發器。 –

+0

檢查這個答案http://stackoverflow.com/questions/946118/how-to-create-ddl-trigger-to-all-databases-in-sql-server-2005-instance – Meherzad

+2

@Meherzad - 完全脫離主題 –

回答

3

看看CDC - Change Data Capture

或者保羅尼爾森的AutoAudit

+0

+1爲好的課程) –

+0

謝謝。但我沒有得到完整的解決方案,你想給我提供任何其他幫助鏈接 –

0
SELECT name 
FROM sys.objects 
WHERE DATEDIFF(D,modify_date, GETDATE()) < 1 

通過使用此查詢,您可以獲得所有數據庫修改。代替1你可以給你不想看到變化的日子。

+0

不知道這是多麼可靠.... –

+0

謝謝。我會嘗試。 –

0

我已經想出了這樣的事情......我希望它能回答你的問題。

  1. 示範
  2. 創建SQL對所有表
  3. 簡單的插入語句創建觸發器創建一些測試表。
CREATE TABLE [dbo].[log_table](
      [table_name] [varchar](1000) NULL, 
      [column_name] [varchar](1000) NULL, 
      [column_value] [varchar](1000) NULL, 
      [datetime] [datetime] NULL 
     ) 
     GO 
CREATE TABLE [dbo].[Animals](
     [AnimalID] [int] IDENTITY(1,1) NOT NULL, 
     [AnimalName] [varchar](50) NULL, 
    CONSTRAINT [PK_Animals] PRIMARY KEY CLUSTERED 
    ([AnimalID] ASC) 
    ) 

    GO 

    CREATE TABLE [dbo].[Countries](
     [CountryID] [uniqueidentifier] NOT NULL, 
     [CountryName] [varchar](50) NULL, 
    CONSTRAINT [PK_Countries] PRIMARY KEY CLUSTERED 
    ([CountryID] ASC)) 
    ALTER TABLE [dbo].[Countries] ADD CONSTRAINT [DF_Countries_countryID] DEFAULT (newid()) FOR [CountryID] 
    GO 
SELECT 
    ' IF OBJECT_ID ('+ CHAR(39) + SCHEMA_NAME(tbl.SCHEMA_ID) + '.trg_' + tbl.name + CHAR(39) + ',''TR'') IS NOT NULL ' + 
    ' DROP TRIGGER ' + SCHEMA_NAME(tbl.SCHEMA_ID) + '.trg_'+ tbl.name + ';' + 
    ' EXEC (' + CHAR(39) + 
    ' CREATE TRIGGER ' + SCHEMA_NAME(tbl.SCHEMA_ID) + '.trg_'+ tbl.name + 
    ' ON '+ SCHEMA_NAME(tbl.SCHEMA_ID) + '.' + tbl.name + ' FOR INSERT,UPDATE AS ' + 
    ' DECLARE @newval varchar(1000) ' + 
    ' SELECT @newval ='+ COL_NAME(tbl.object_id, ic.column_id) + ' FROM INSERTED' + 
    ' INSERT INTO log_table(table_name,column_name,column_value,datetime) VALUES('+ 
    CHAR(39)+ CHAR(39) + SCHEMA_NAME(tbl.SCHEMA_ID) +'.'+ tbl.name + CHAR(39)+ CHAR(39) + ' ,'+ 
    CHAR(39)+ CHAR(39) + COL_NAME(tbl.object_id, ic.column_id) + CHAR(39)+ CHAR(39) + ' ,'+  
    '@newval,getdate()'+ ')' + CHAR(39)+ ')' 
FROM 
    sys.tables AS tbl 
    INNER JOIN sys.key_constraints AS kc ON kc.parent_object_id = tbl.object_id 
    INNER JOIN sys.indexes AS i ON kc.unique_index_id = i.index_id AND kc.parent_object_id = i.object_id 
    INNER JOIN sys.index_columns AS ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id 
WHERE tbl.type = 'U' AND ic.is_included_column = 0 and tbl.name NOT IN ('sysdiagrams','log_table') 
ORDER BY tbl.object_id, ic.key_ordinal; 

現在插入到我們的表

INSERT INTO Countries(CountryName) VALUES('South Africa') 
INSERT INTO Countries(CountryName) VALUES('USA') 
INSERT INTO Countries(CountryName) VALUES('Brazil') 
INSERT INTO Countries(CountryName) VALUES('Zimbabwe') 
INSERT INTO Countries(CountryName) VALUES('Africa is not a country') 


INSERT INTO Animals(AnimalName) VALUES ('Lion') 
INSERT INTO Animals(AnimalName) VALUES ('African Elephant') 
INSERT INTO Animals(AnimalName) VALUES ('Rhinoceros') 
INSERT INTO Animals(AnimalName) VALUES ('Leopard') 
INSERT INTO Animals(AnimalName) VALUES ('Cape Buffalo') 
+0

就我而言,這個問題很清楚。 Manoj需要跟蹤每日更新的表格,並且能夠查看插入/更新記錄的主鍵值。這就是我的理解。 – Thato