SQL Server在提交之前触发INSTEAD OF INSERT以设置时间戳

aru*_*uuu -1 sql t-sql database sql-server

在SQL Server 2008 R2中,我希望创建一个模仿Oracle BEFORE INSERT触发器行为的触发器,其中任何插入的触发器都会在持久化之前将UPDATE_TS和CREATE_TS更新为当前时间戳.

我现在看到的问题是错误:只有在使用列列表且IDENTITY_INSERT为ON时,才能指定表'MY_TABLE'中标识列的显式值

我不确定将SET IDENTITY INSERT表打开然后在触发器中将SET IDENTITY INSERT表关闭是否是个好主意.也许这是一个可能的解决方案.

请告知最佳做法.

示例表称为MY_TABLE:

CREATE TABLE [myschema].[MY_TABLE](
[MY_TABLE_ID] [bigint] IDENTITY(1,1) NOT NULL,
[FIELD_TO_UPDATE] [varchar](255) NOT NULL,
[CREATE_TS] [datetime] NULL,
[UPDATE_TS] [datetime] NULL),
PRIMARY KEY (MY_TABLE_ID))
Run Code Online (Sandbox Code Playgroud)

触发:

CREATE TRIGGER my_table_create_ts_trigger 
ON [mydb].myschema.MY_TABLE
INSTEAD OF INSERT
AS
BEGIN
    INSERT INTO MY_TABLE([MY_TABLE_ID], [FIELD_TO_UPDATE], [CREATE_TS], [UPDATE_TS])
    SELECT i.MY_TABLE_ID, i.FIELD_TO_UPDATE, GETDATE(), GETDATE()
    FROM INSERTED as i
END
Run Code Online (Sandbox Code Playgroud)

Lam*_*mak 6

不确定为什么要使用动态SQL,这不是真正需要的.此外,不需要UPDATE事后做,你可以这样做:

CREATE TRIGGER my_table_create_ts_trigger 
ON [mydb].myschema.MY_TABLE
INSTEAD OF INSERT
AS
BEGIN

    INSERT INTO MY_TABLE(<list of every non identity column here>)
    SELECT <list of every non identity column and the date here>, GETDATE()
    FROM INSERTED

END
Run Code Online (Sandbox Code Playgroud)

此外,您应该在INSERT和中明确列出列SELECT.

  • 如果该列的值将始终**来自应用程序,为什么在第一个地方使用"IDENTITY"?我怎么知道你的情况下是否安全?,应用程序是否确保该值不存在?,如何管理多个插入?,并发性如何?这就是为什么我说你应该只使用`IDENTITY`列而不是使用应用程序来生成它 (2认同)