问题: 有没有办法设置数据库会话变量:
declare @app_user varchar(30)='otto'
在C#中使用linq-to-sql,这样变量可用于DB中的触发器?
背景: 我正在使用触发器实现穷人的日记功能,我想传递应用程序用户以包含在日志表中:
CREATE TRIGGER [Trg_Jrn_Table1] ON [dbo].[Table1]
FOR INSERT, UPDATE, DELETE AS
...
INSERT INTO dbo.[Jrn_Table1] ([jrnDmlType],[jrnUser],<cols>...)
SELECT @dml_type, @app_user, <cols> FROM inserted i WITH (NOLOCK)
(我知道我还需要用suser_sname来跟踪临时更改)
我能找到的关于linq2sql和会话变量的所有内容都集中在C#会话变量上,我真的不知道从哪里开始。我希望有类似的东西:
DataContext dc = createDataContext(cfg);
dc.addSessionData("app_user", "otto");
但自然不存在: - )
是否可以使用db会话变量?或者使用:setvar
或CONTEXT_INFO
?
2016年4月22日更新: 我尝试在两个地方添加c#代码,其中创建了DataContext并且在更新之前。我可以看到我的命令在日志中执行,但是从触发器中,临时数据不可用。
设置会话变量:
DataContext.ExecuteCommand("declare @app_user varchar(30)={0}", username);
在临时表中
DataContext.ExecuteCommand("select {0} usrName into #session_info", username);
使用context_info(参见:link)
DataContext.ExecuteCommand("declare @Length tinyint;declare @Ctx varbinary(128);select @Length = len({0});select @Ctx = convert(binary(1), @Length) + convert(varbinary(127), {1});set context_info @Ctx", username, username);