sql >> データベース >  >> RDS >> Sqlserver

SQLServer2008の行の挿入と更新のタイムスタンプ

    試してみてください

    CREATE TABLE [dbo].[Names]
    (
        [Name] [nvarchar](64) NOT NULL,
        [CreateTS] [smalldatetime] NOT NULL CONSTRAINT CreateTS_DF DEFAULT CURRENT_TIMESTAMP,
        [UpdateTS] [smalldatetime] NOT NULL
    
    )
    

    PSIは、smalldatetimeで十分だと考えています。別の方法で決めることができます。

    「衝撃の瞬間」でこれを行うことはできませんか?

    SQL Serverでは、これは一般的です:

    Update dbo.MyTable 
    Set 
    
    ColA = @SomeValue , 
    UpdateDS = CURRENT_TIMESTAMP
    Where...........
    

    SQLServerには「タイムスタンプ」データ型があります。

    しかし、それはあなたが思っていることではないかもしれません。

    参考資料は次のとおりです:

    http://msdn.microsoft.com/en-us/library/ms182776(v=sql.90).aspx

    次に、RowVersion(タイムスタンプの同義語)の例を示します。

    CREATE TABLE [dbo].[Names]
    (
        [Name] [nvarchar](64) NOT NULL,
        RowVers rowversion ,
        [CreateTS] [datetime] NOT NULL CONSTRAINT CreateTS_DF DEFAULT CURRENT_TIMESTAMP,
        [UpdateTS] [datetime] NOT NULL
    
    )
    
    
    INSERT INTO dbo.Names (Name,UpdateTS)
    select 'John' , CURRENT_TIMESTAMP
    UNION ALL select 'Mary' , CURRENT_TIMESTAMP
    UNION ALL select 'Paul' , CURRENT_TIMESTAMP
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    
    Update dbo.Names Set Name = Name
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    

    おそらく完全な実例:

    DROP TABLE [dbo].[Names]
    GO
    
    
    CREATE TABLE [dbo].[Names]
    (
        [Name] [nvarchar](64) NOT NULL,
        RowVers rowversion ,
        [CreateTS] [datetime] NOT NULL CONSTRAINT CreateTS_DF DEFAULT CURRENT_TIMESTAMP,
        [UpdateTS] [datetime] NOT NULL
    
    )
    
    GO
    
    CREATE TRIGGER dbo.trgKeepUpdateDateInSync_ByeByeBye ON dbo.Names
    AFTER INSERT, UPDATE
    AS
    
    BEGIN
    
    Update dbo.Names Set UpdateTS = CURRENT_TIMESTAMP from dbo.Names myAlias , inserted triggerInsertedTable where 
    triggerInsertedTable.Name = myAlias.Name
    
    END
    
    
    GO
    
    
    
    
    
    
    INSERT INTO dbo.Names (Name,UpdateTS)
    select 'John' , CURRENT_TIMESTAMP
    UNION ALL select 'Mary' , CURRENT_TIMESTAMP
    UNION ALL select 'Paul' , CURRENT_TIMESTAMP
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    
    Update dbo.Names Set Name = Name , UpdateTS = '03/03/2003' /* notice that even though I set it to 2003, the trigger takes over */
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    

    「名前」の値を一致させるのはおそらく賢明ではありません。

    SurrogateKeyを使用してこのより主流の例を試してください

    DROP TABLE [dbo].[Names]
    GO
    
    
    CREATE TABLE [dbo].[Names]
    (
        SurrogateKey int not null Primary Key Identity (1001,1),
        [Name] [nvarchar](64) NOT NULL,
        RowVers rowversion ,
        [CreateTS] [datetime] NOT NULL CONSTRAINT CreateTS_DF DEFAULT CURRENT_TIMESTAMP,
        [UpdateTS] [datetime] NOT NULL
    
    )
    
    GO
    
    CREATE TRIGGER dbo.trgKeepUpdateDateInSync_ByeByeBye ON dbo.Names
    AFTER UPDATE
    AS
    
    BEGIN
    
       UPDATE dbo.Names
        SET UpdateTS = CURRENT_TIMESTAMP
        From  dbo.Names myAlias
        WHERE exists ( select null from inserted triggerInsertedTable where myAlias.SurrogateKey = triggerInsertedTable.SurrogateKey)
    
    END
    
    
    GO
    
    
    
    
    
    
    INSERT INTO dbo.Names (Name,UpdateTS)
    select 'John' , CURRENT_TIMESTAMP
    UNION ALL select 'Mary' , CURRENT_TIMESTAMP
    UNION ALL select 'Paul' , CURRENT_TIMESTAMP
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    
    Update dbo.Names Set Name = Name , UpdateTS = '03/03/2003' /* notice that even though I set it to 2003, the trigger takes over */
    
    select *  ,  ConvertedRowVers = CONVERT(bigint,RowVers) from [dbo].[Names]
    


    1. Oracleのすべてのテーブルのリストを取得しますか?

    2. SQL Server(T-SQL)で「smalldatetime」を「datetime」に変換する例

    3. インデックスの一部ではない外部キーの列に関するAndroidRoomのコンパイル時の警告。どういう意味ですか?

    4. proxysql-admin代替-ClusterControlProxySQLGUI