2017-03-22 48 views
0

我正在爲我的公司設計應用程序。我們將使用SQL Server作爲應用程序的數據庫。當在數據庫中創建實際表時,我可能不參與。如何確保爲SQL Server中的每個表默認創建2列

但是,我想確保在開發人員創建的每個表中都存在2列(即creationdate,modifydate)。另外,我想限制開發人員使用Identity Columns,因爲我的管理層要求我這樣做,除非他們希望僅通過應用程序生成數據,即使它是正在運行的序列號,也不會分配任何具體原因。

我不確定如何實現這一點,而不參與表的實際創建。

請在此引導我。

回答

2

您可以使用DDL觸發器和捕捉事件創建一個表,火災發生後

CREATE TRIGGER safety 
ON DATABASE 
FOR create_table 
AS 
select eventdata()--this is sample,here you need to parse event data 

現在創建一個表將確保,你有以下的XML

<UserName>dbo</UserName> 
<DatabaseName>PerformanceV3</DatabaseName> 
<SchemaName>dbo</SchemaName> 
<ObjectName>test111</ObjectName> 
<ObjectType>TABLE</ObjectType> 
<TSQLCommand> 
<SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" /> 
<CommandText>create table dbo.test111 
(
id int 
) 
</CommandText> 
</TSQLCommand> 

您可以分析訪問以上XML和檢查所需的列,可以回滾或做你需要的任何東西

---以下是僞代碼,你可以如何做到這一點

Alter TRIGGER safety 
ON DATABASE 
FOR create_table 
AS 
Begin 
Declare @EventData XML 
set @eventdata= EVENTDATA(); 

declare @tsqlcmd varchar(max) 

Set @tsqlcmd= @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)') 

if @tsqlcmd not like '%columns you need%' 
begin 
print 'add those two columns' 
rollback 
end 
end 
+0

或乾脆在觸發自動添加列... –

+0

可能是值得包括修改表的語句了。 –

+0

@GarethLyons:現在加入 – TheGameiswar

0

您可以查詢不通過該符合條件的現有表:

SELECT 
    SCHEMA_NAME(o.schema_id) AS [Schema], 
    o.name AS [Table], o.object_id, o.create_date, o.modify_date 
FROM 
    sys.objects o 
WHERE 
    o.type = 'U' 
    AND o.is_ms_shipped = 0 
    AND ((NOT EXISTS (SELECT * 
         FROM sys.columns c 
         INNER JOIN sys.types t on t.system_type_id = c.system_type_id 
         WHERE c.object_id = o.object_id 
         AND c.name = 'modifydate' 
         AND t.name IN ('date', 'datetime', 'datetime2', 'smalldatetime')) 
      AND 
      NOT EXISTS (SELECT * 
         FROM sys.columns c 
         INNER JOIN sys.types t on t.system_type_id = c.system_type_id 
         WHERE c.object_id = o.object_id 
         AND c.name = 'creationdate' 
         AND t.name IN ('date', 'datetime', 'datetime2', 'smalldatetime')) 
     ) 
     OR EXISTS (SELECT * FROM sys.columns c WHERE c.object_id = o.object_id AND c.is_identity = 1) 
    ) 
ORDER BY 
    SCHEMA_NAME(o.schema_id), o.name 
+0

如果正確理解,此查詢將檢查創建表後是否存在列。如果它沒有像** CreatedOn **(日期時間)和** CreatedBy **(int)這樣的指定列,我想限制表的創建。 –

+0

是的,但它會讓你退回來檢查是否有任何錯過。 –

相關問題