How do I add a “last modified” and “created” column in a SQL Server table?

前端 未结 5 1098
误落风尘
误落风尘 2020-12-13 01:57

I\'m design a new db schema for a SQL Server 2012 database.

Each table should get two extra columns called modified and created which shoul

5条回答
  •  旧时难觅i
    2020-12-13 02:45

    Generally, you can have the following columns:

    • LastModifiedBy
    • LastModifiedOn
    • CreatedBy
    • CreatedOn

    where LastModifiedBy and CreatedBy are references to a users table (UserID) and the LastModifiedOn and CreatetOn columns are date and time columns.

    You have the following options:

    1. Solution without triggers - I have read somewhere that "The best way to write triggers is not to write such." and you should know that generally they are hurting the performance. So, if you can avoid them it is better to do so, even using triggers may look the easiest thing to do in some cases.

      So, just edit all you INSERT and UPDATE statements to include the current UserID and current date and time. If such user ID can not be defined (anonymous user) you can use 0 instead and the default value of the columns (in case no user ID is specified will be NULL). When you see NULL values are inserted you should find the "guilty" statements and edit it.

    2. Solution with triggers - you can created AFTER INSERT, UPDATE trigger and populated the users columns there. It's easy to get the current date and time in the context of the trigger (use GETUTCDATE() for example). The issue here is that the triggers do not allowed passing/accepting parameters. So, as you are not inserting the user ID value and you are not able to pass it to the trigger. How to find the current user?

      You can use SET CONTEXT_INFO and CONTEXT_INFO. Before all you insert and update statements you must use the SET CONTEXT_INFO to add the current user ID to the current context and in the trigger you are using the CONTEXT_INFO function to extract it.

    So, when using triggers you again need to edit all your INSERT and UPDATE clauses - that's why I prefer not to use them.

    Anyway, if you need to have only date and time columns and not created/modified by columns, using triggers is more durable and easier as you are not going to edit any other statements now and in the future.


    With SQL Server 2016 we can now use the SESSION_CONTEXT function to read session details. The details are set using sp_set_session_context (as read-only or read and write). The things are a little bit user-friendly:

    EXEC sp_set_session_context 'user_id', 4;  
    SELECT SESSION_CONTEXT(N'user_id');  
    

    A nice example.

提交回复
热议问题