Sql-Server
使用 bcp 插入後,插入觸發器未觸發
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