【问题标题】:BCP ignore the trigger, what can I do?BCP 忽略触发器,我该怎么办?
【发布时间】:2012-04-06 01:19:41
【问题描述】:

当我在数据库中使用 BCP 数据时,触发器不会被触发。 我应该怎么做才能使触发器有用?我可以只更新数据而不更改值吗?

     try
        {
            //get all data
            string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" + "Data Source=" + excelFile + ";" + "Extended Properties=Excel 8.0;";
            OleDbConnection conn = new OleDbConnection(strConn);
            conn.Open();
            string strExcel = "";
            strExcel = string.Format("select * from [{0}$] where xh<>''", sheetName);
            OleDbDataAdapter oda = new OleDbDataAdapter(strExcel, strConn);
            oda.Fill(ds, sheetName);

            //BCP data
            using (SqlBulkCopy bcp = new SqlBulkCopy(connectionString))
            {
                bcp.SqlRowsCopied += new SqlRowsCopiedEventHandler(bcp_SqlRowsCopied);
                bcp.BatchSize = 100;//the speed of import
                bcp.NotifyAfter = 100;
                bcp.DestinationTableName = sheetName;//target table
                bcp.WriteToServer(ds.Tables[0]);
            }
        }
   catch (Exception ex)
        {
            System.Windows.Forms.MessageBox.Show(ex.Message);
        }

触发器正在跟随。

创建触发器 getAge
关于表名
用于插入、更新
作为
如果更新(生日)
更新表名 set age=DateDiff(year,birthday,getdate())

【问题讨论】:

  • 另外,应该指出 DATEDIFF(Year, Birthday, GETDATE()) 是一种非常不可靠的返回年龄的方法。尤其是元旦,几乎每个人都会算错年龄

标签: triggers bcp


【解决方案1】:

查看这篇 MSDN 文章:http://msdn.microsoft.com/en-us/library/ms187640.aspx

使用 bcp,默认情况下禁用触发器。要启用它,请使用以下参数:

-h "FIRE_TRIGGERS"

使用 .NET 提供的 SqlBulkCopy 类时,请使用 SqlBulkCopyOptions 枚举来启用触发器。

【讨论】:

  • 我找到了这个解决方案,但我不明白。你能更具体地解释一下吗?谢谢。
  • 显然 SQL Server 禁用了触发器,但没有将其标记为禁用(在 sys.triggers 中),并且在 bcp 完成后它不会重新启用触发器。我会称之为错误。
猜你喜欢
  • 2014-04-15
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-13
  • 2014-03-07
  • 2017-03-03
  • 2021-08-06
  • 2014-12-06
相关资源
最近更新 更多