代码之家  ›  专栏  ›  技术社区  ›  Cory

ssis:“插入只读列失败<columnname>”

  •  1
  • Cory  · 技术社区  · 16 年前

    我有一个Excel源正在进入一个OLE DB目标。我正在将数据插入一个视图,该视图有一个处理所有插入的instead-of-trigger。当我尝试执行包时,收到以下错误:

    < Buff行情>

    “无法插入只读列columnname”,

    < /块引用>

    我该怎么做才能让SSIS知道插入此视图是安全的,因为有一个INSTEADOF触发器将处理插入?

    编辑(附加信息):
    更多附加信息。我有一个平面文件正在插入到规范化数据库中。我最初的问题是如何获取一个平面文件并将该数据插入多个表中,同时跟踪所有主键/外键关系。我的解决方案是创建一个模仿平面文件结构的视图,然后在该视图上创建一个instead-of-trigger。在我的而不是触发器中,我将处理维护表之间所有关系的逻辑

    我的视图看起来像这样。

    创建视图导入视图 AS 选择 将(varchar(100,空)转换为customername, 将(varchar(100),空)转换为地址1, 将(varchar(100),空)转换为地址2, 将(varchar(100),空)转换为city, 将(char(2),null)转换为状态, 将(varchar(250),null)转换为itemOrdered, 将(int,null)转换为QuantityOrdered … < /代码>

    我永远不需要从这个视图中选择,我只使用它从我收到的这个平面文件中插入数据。我需要某种方法来告诉SQL Server这些字段不是真正的只读字段,因为此视图上有一个instead-of触发器。

    “无法插入只读列columnname”

    alt text

    我该怎么做才能让SSIS知道插入此视图是安全的,因为有一个INSTEADOF触发器将处理插入?

    编辑(附加信息):
    更多附加信息。我有一个平面文件正在插入到规范化数据库中。我最初的问题是如何获取一个平面文件并将该数据插入多个表中,同时跟踪所有主键/外键关系。我的解决方案是创建一个模仿平面文件结构的视图,然后在该视图上创建一个instead-of-trigger。在我的而不是触发器中,我将处理维护表之间所有关系的逻辑

    我的观点是这样的。

    CREATE VIEW ImportView
    AS
    SELECT
    CONVERT(varchar(100, NULL) AS CustomerName,
    CONVERT(varchar(100), NULL) AS Address1,
    CONVERT(varchar(100), NULL) AS Address2,
    CONVERT(varchar(100), NULL) AS City,
    CONVERT(char(2), NULL) AS State,
    CONVERT(varchar(250), NULL) AS ItemOrdered,
    CONVERT(int, NULL) AS QuantityOrdered
    ...
    

    我永远不需要从这个视图中选择,我只使用它从我收到的这个平面文件中插入数据。我需要某种方法来告诉SQL Server这些字段不是真正的只读字段,因为这个视图上有一个INSTEADOF触发器。

    3 回复  |  直到 12 年前
        1
  •  3
  •   Pepys    12 年前

    另外,你可以选择 Keep Identity 如果列为 IDENTITY

        2
  •  0
  •   Cory    16 年前

    这不是一个理想的解决方案,但我找到了解决问题的方法。由于ssis抱怨在视图中插入数据,我创建了一个与视图结构完全相同的表。然后,在该表上的instead而不是trigger中,我只是将针对该表的信息插入到视图中。这给导入过程又增加了一个步骤,但不是什么大问题。

        3
  •  0
  •   Damir Sudarevic    16 年前

    为什么列“只读”?可以发布视图和基础表的架构吗?是专栏 IDENTITY 是吗?有没有 WITH CHECK OPTION 观点?它是派生(计算)列吗?

    更新 以下内容:

    我现在看到,视图的应用有点不寻常,也许存储过程会是更合适的选择——数据库中的存储过程和SSIS中的OLEDB命令。

    如果不使用触发器,而是使用从临时表到“最终”表的大容量插入,那么将表作为目标的最终解决方案实际上更快。