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)
不确定为什么要使用动态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.
| 归档时间: |
|
| 查看次数: |
3355 次 |
| 最近记录: |