1

新しいデータベースを作成していますが、各テーブルには次のような列がいくつか必要です。

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

したがって、誰かがテーブルを作成した場合; これらの列は自動的に追加され、テーブル作成 T-SQL でこれらの列をスクリプト化する必要はありません。Management Studio からデザインを介して作成するか、これらの列を自動的に追加するスクリプトを使用します。

これを行う方法はありますか?

4

1 に答える 1

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または別の同様の製品に新しいテーブルを保存します。それがあなたのテーブルを再び開いた後 -

っと

于 2013-09-26T06:52:23.087 に答える