我正在研究 SQL Server 2008 R2。
我有一个表的好处,它有一个名为tiu_benefit的 AFTER INSERT, UPDATE 触发器。
我想为此表编写一个 UPDATE 语句来更新 1 行,但我不希望触发它的触发器。我知道我可以在 UPDATE 之前禁用触发器,然后在 UPDATE 之后启用触发器:
DISABLE TRIGGER tiu_benefit ON benefit;
GO
UPDATE benefit SET editor = 'srh' where benefit_id = 9876
GO
ENABLE TRIGGER tiu_benefit ON benefit;
GO
Run Code Online (Sandbox Code Playgroud)
但是这个禁用和启用触发器将影响当前登录的所有用户。因此,当我的脚本禁用触发器时,另一个用户有可能运行 UPDATE/INSERT,这并不好。这就是为什么我只想为当前会话禁用和启用触发器。是否可以?如果是,请告诉如何。
谢谢
我有一张不断更新的表,没有人能弄清楚更新的来源。我怀疑它们来自实体框架,但我想通过扩展事件捕获更新和相关信息来证明这个理论。
我正在使用 SQL 2014 Enterprise,并尝试使用 exec_prepared_sql 和 sql_statement_starting 事件捕获该信息。这是我到目前为止所拥有的:
CREATE EVENT SESSION [Query Trace] ON SERVER
ADD EVENT sqlserver.exec_prepared_sql(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123))),
ADD EVENT sqlserver.sql_statement_starting(
ACTION(sqlserver.client_app_name,sqlserver.client_hostname,sqlserver.database_id,sqlserver.database_name,sqlserver.plan_handle,sqlserver.session_id,sqlserver.sql_text,sqlserver.username)
WHERE ([sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%UPDATE %') AND [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text],N'%TableA%') AND [sqlserver].[database_id]=(123)))
ADD TARGET package0.event_file(SET filename=N'E:\ExtendedEvent\Query-Trace.xel')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=ON,STARTUP_STATE=OFF)
GO
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,我已经对其进行了测试,并且能够捕获常规 UPDATE 语句和使用 sp_executesql 调用的语句。但是,我仍然缺少一些东西。表中的数据仍在修改,并且此扩展事件未捕获执行此操作的 UPDATE。
所以,我的问题是:
1) 为了捕获可能来自实体框架的更新,我还需要在扩展事件中观察其他什么吗?
2)为此我应该使用其他什么来代替扩展事件吗?
谢谢!