使用LINQ to SQL临时禁用Sql Server中的触发器

时间:2015-09-14 14:35:46

标签: c# sql-server linq

我在c#中创建了以下方法暂时禁用触发器

public static void DisableTriggers<TEntity>(this Table<TEntity> table) where TEntity : class
    {
        ArgumentValidation.CheckForNullReference(table, "table");

        string sql = string.Format("IF object_id('tempdb..#DISABLETRIGGER_ReviewEDoc') IS NULL BEGIN create table tempdb..#DISABLETRIGGER_ReviewEDoc (col int) END", table.GetTriggerDisabledTempTableName());

        table.Context.ExecuteCommandLogErrors(sql);
    }

在SQL更新触发器中检查相同的临时表,如下所示

IF OBJECT_ID('tempdb..#DISABLETRIGGER_ReviewEDoc') IS NULL
BEGIN
-- SKIP logic written here
END

问题是它似乎不起作用,检查总是返回null。

提前感谢您的想法/建议

1 个答案:

答案 0 :(得分:0)

那是因为临时对象的“真实”名称与您在脚本中使用的名称不同。

修改 如果您运行此脚本:

SELECT COUNT(*) FROM tempdb.sys.objects
SELECT TOP 1 * FROM tempdb.sys.objects ORDER BY create_date DESC

CREATE TABLE #MyTempTable ( ID int )
SELECT TOP 1 * FROM tempdb.sys.objects ORDER BY create_date DESC
SELECT COUNT(*) FROM tempdb.sys.objects

DROP TABLE #MyTempTable
SELECT COUNT(*) FROM tempdb.sys.objects
SELECT TOP 1 * FROM tempdb.sys.objects ORDER BY create_date DESC

您将看到Temp DB中的对象。 name列是数据库对象(即表)的真实姓名。

名称#MyTempTable由sql server execution engine转换为更正名称。在我的例子中,有一个名为#MyTempTable________________________________________________________________________________________________________00000000027C的对象。