Sql-Server

使用 bcp 插入後,插入觸發器未觸發

  • June 27, 2021

csv文件的內容

TEST_1|sl2sysxbar301.dv.local|{'message_type': 2, 'super_evt_non_error': {'a0': 0, 'a1': 0, 'a2': 0, 'a3': 0, 'event': 5528, 'event_string': 'ENERGY_CTRL_RIGHT_PROX_DOWN', 'history_buffer_id': 3, 'history_buffer_string': 'HISTORY_BUFFER_UI_EVT', 'mid': 10, 'mid_string': 'CONSOLE1'}}|2021-06-26 05:03:20|
TEST_11|sl2sysxbar301.dv.local|{'message_type': 2, 'super_evt_non_error': {'a0': 393280, 'a1': 1, 'a2': 0, 'a3': 0, 'event': 8316, 'event_string': 'BP_FOLLOW_CHECK', 'history_buffer_id': 0, 'history_buffer_string': 'HISTORY_BUFFER_BP', 'mid': 6, 'mid_string': 'MTMR'}}|2021-06-26 05:03:20|
TEST_2|sl2sysxbar301.dv.local|{'message_type': 4, 'mmdsp_log': {'bp_start': {'bp_arg': 0.0, 'bp_code': 4097, 'bp_sn': 393300, 'mid': 6}, 'legacy_log_idx': 0}}|2021-06-26 05:03:20|
TEST_4|sl2sysxbar301.dv.local|{'message_type': 2, 'super_evt_non_error': {'a0': 267, 'a1': 0, 'a2': 0, 'a3': 0, 'event': 100001, 'event_string': 'INTER_MANIP', 'history_buffer_id': 3, 'history_buffer_string': 'HISTORY_BUFFER_UI_EVT', 'mid': 1, 'mid_string': 'AIM2'}}|2021-06-26 05:03:20|

這是通過 python 執行的 bcp

           p = subprocess.Popen(
               f'/opt/mssql-tools/bin/bcp {app.config.db_table_name} in {f.get("filename")}  -S {app.config.db_host},{app.config.db_port} -U {app.config.db_username} -P {app.config.db_password} -t  "|"  -c',
               shell=True,
               stdout=subprocess.PIPE,
               stderr=subprocess.STDOUT
           )

我有這張表和触發器

CREATE TABLE [EVT_STREAM].[Event](
   [SystemName] [varchar](25) NOT NULL,
   [Router] [varchar](128) NULL,
 [Event] [nvarchar](max) NULL,
 [ReceivedAt] [datetime] NOT NULL,
 [InsertedAt] [datetime] NULL
)ON [PRIMARY]
GO

CREATE TRIGGER [EVT_STREAM].[trg_EVT_STREAM]
  ON [EVT_STREAM].[Event]
  FOR INSERT
AS
BEGIN
SET NOCOUNT ON;
insert into [EVT_STREAM].[Event](
 [InsertedAt]
)
 VALUES(
   GETUTCDATE()
   )
END
GO

ALTER TABLE [EVT_STREAM].[Event] ENABLE TRIGGER [trg_EVT_STREAM]
GO

基本上我想[InsertedAt]在 BCP 執行並在其中插入 CSV 記錄時進行更新

$$ EVT_STREAM $$.$$ Event $$桌子。

bcp有一個選項:FIRE_TRIGGERS 連結在這裡 (預設情況下,觸發器不會被觸發。要顯式觸發觸發器,請使用帶有 FIRE_TRIGGERS 提示的 -h 選項。) -h"FIRE_TRIGGERS "

  • FIRE_TRIGGERS

使用 in 參數指定,在目標表上定義的任何插入觸發器都將在大容量複製操作期間執行。如果未指定 FIRE_TRIGGERS,則不會執行任何插入觸發器。對於 out、queryout 和格式參數,將忽略 FIRE_TRIGGERS。

根據 MBuschi 的建議

使用 getdate() 為欄位創建預設值不是更好嗎

$$ InsertedAt $$?

我能夠找到不需要單獨觸發器的替代解決方案:

CREATE TABLE [EVT_STREAM].[Event](
[SystemName] [varchar](25) NOT NULL,
[Router] [varchar](128) NULL,
[Event] [nvarchar](max) NULL,
[ReceivedAt] [datetime] NOT NULL,
[InsertedAt] [datetime] NULL
)ON [PRIMARY]
GO

ALTER TABLE [EVT_STREAM].[Event]
ADD CONSTRAINT df_inserted_at
DEFAULT GETUTCDATE() FOR InsertedAt
GO

引用自:https://dba.stackexchange.com/questions/294851