SqlBulkCopy.WriteToServer运行需哪些权限?列排序规则错误排查
问题原因分析
- 表名中的下划线是SQL Server合法的对象名字符,不会触发该报错,你修改表名后报错变化是因为修改后的表名不存在,触发了找不到表的错误,和下划线无关。
- 第一个
Failed to obtain column collation information报错的常见触发原因有两类:一是DataTable与目标表的列结构/类型/顺序不匹配,没有显式配置列映射;二是当前数据库账号权限不足,无法读取目标表的元数据。
SqlBulkCopy.WriteToServer 运行所需权限
- 目标表的
INSERT权限,用于写入数据 - 目标表的
ALTER TABLE权限,用于SqlBulkCopy读取表的元数据、校验约束、执行批量插入的表级操作 - 若使用
SqlBulkCopyOptions.KeepIdentity参数写入自增列,无需额外权限,只要账号有上述两个权限即可
修复步骤
- 显式配置列映射,避免列顺序不一致导致的匹配错误,代码示例:
using DataTable test = logs.ConvertToDataTable(); using SqlConnection connection = (SqlConnection)_connectionFactory.GetDatabaseConnection(); // 按需添加KeepIdentity、CheckConstraints等参数 SqlBulkCopy bulk = new SqlBulkCopy(connection, SqlBulkCopyOptions.Default, null); bulk.DestinationTableName = "[database].[schema].[Table_With_Underline]"; // 按实际列名添加映射,不要包含目标表的Identity列(如果没开启KeepIdentity参数) bulk.ColumnMappings.Add("日志内容", "日志内容"); bulk.ColumnMappings.Add("生成时间", "生成时间"); // 其余列依次添加映射 connection.Open(); bulk.WriteToServer(test);
- 给操作账号授予对应权限,执行SQL语句:
USE [database]; GO GRANT INSERT, ALTER ON [schema].[Table_With_Underline] TO [你的操作账号]; GO
- 如果仍有报错,可先将连接字符串的初始目录指定为目标数据库
[database],将DestinationTableName简化为[schema].[Table_With_Underline]再测试。
内容的提问来源于stack exchange,提问作者Jackfowl
相关产品推荐
相关产品推荐

