2013-09-26 21 views
1

我創建新的數據庫,並在每個表我想有這樣幾列:自動添加特定的列在創建新表

CreatedBy, 
CreatedDate, 
ModifiedBy, 
ModifiedDate, 
.... 

所以如果有人創建表;這些列應自動添加,無需在創建表T-SQL中編寫腳本。要麼通過Management Studio的設計創建,要麼使用腳本,它應該自動添加這些列。

有沒有辦法做到這一點?

+0

使用觸發器,之後每插入 –

+1

@Nadeem_MK我想創建表時,他指的是執行。我不確定是否有可能... – Szymon

+0

雷內。有已存在的職位,其中存儲的proc被定義爲在現有表中添加列,但我在談論創建時每個表的默認列。 –

回答

3

試試這個動態查詢(自動列添加到您的表):

DECLARE @SQL NVARCHAR(MAX) 
SELECT @SQL = STUFF((
    SELECT CHAR(13) + 'ALTER TABLE [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] 
    ADD 
      CreatedBy DATETIME 
     , CreatedDate DATETIME 
     , ModifiedBy DATETIME 
     , ModifiedDate DATETIME;' 
    FROM sys.objects o 
    WHERE o.[type] = 'U' 
     AND NOT EXISTS(
      SELECT 1 
      FROM sys.columns c 
      WHERE o.[object_id] = c.[object_id] 
       AND TYPE_NAME(c.system_type_id) = 'DATETIME' 
       AND c.name IN ('CreatedBy', 'CreatedDate', 'ModifiedBy', 'ModifiedDate') 
     ) 
    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') 


PRINT @SQL 
EXEC sys.sp_executesql @SQL 

輸出:

ALTER TABLE [dbo].[test] 
    ADD 
      CreatedBy DATETIME 
     , CreatedDate DATETIME 
     , ModifiedBy DATETIME 
     , ModifiedDate DATETIME; 

更新與DDL觸發器:

CREATE TRIGGER TRG_TABLES 
    ON DATABASE 
    AFTER CREATE_TABLE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @TABLE_NAME SYSNAME 
    SELECT @TABLE_NAME = EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'SYSNAME') 

    DECLARE @SQL NVARCHAR(MAX) 
    SELECT @SQL = STUFF((
     SELECT CHAR(13) + 'ALTER TABLE [' + SCHEMA_NAME(o.[schema_id]) + '].[' + o.name + '] 
     ADD 
       CreatedBy DATETIME 
      , CreatedDate DATETIME 
      , ModifiedBy DATETIME 
      , ModifiedDate DATETIME;' 
     FROM sys.objects o 
     WHERE o.[type] = 'U' 
      AND o.[object_id] = OBJECT_ID(@TABLE_NAME) 
      AND NOT EXISTS(
       SELECT 1 
       FROM sys.columns c 
       WHERE o.[object_id] = c.[object_id] 
        AND TYPE_NAME(c.system_type_id) = 'DATETIME' 
        AND c.name IN ('CreatedBy', 'CreatedDate', 'ModifiedBy', 'ModifiedDate') 
      ) 
     FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '') 

    EXEC sys.sp_executesql @SQL 

END 
GO 

保存在SSMS新表或任何其它類似的產品。它只是重新打開表後 -

ttt

+0

Devart。感謝您的迴應,但正如我已經提到的不是現有的表格。這些列應該在我創建新表時自動添加。 –

+0

只需創建一個新的'DDL'觸發器並將此查詢放入觸發器主體。 – Devart

+0

Devart。我做了但沒有結果。 –

相關問題