【问题标题】:How do I update a key field on insert for SQL Server (Siebel table S_CAMP_CON)如何更新 SQL Server 的插入键字段(Siebel 表 S_CAMP_CON)
【发布时间】:2009-10-20 10:44:45
【问题描述】:

我需要有关在 SQL Server 中编写触发器以在 Siebel 中使用的帮助:

  • 系统字段 ROW_ID 必须是唯一的(键)
  • 当字段 INSERT_CD 和 CAMP_WAVE_ID 为空时,必须生成 ROW_ID(见下文)。
  • 如果不是,请保持 ROW_ID 不变。
  • ROW_ID 是 varchar(15) 的关键字段。

以下语句生成完美的键/行ID:

select substring(replace (CAST (newid() as varchar(36)),'-',''),1,15)

我需要有关编写 SQL Server 2005 触发器以生成此密钥的帮助。

【问题讨论】:

  • 这是来自 Oracle 的提示:在 S_CAMP_CON 上为每一行插入之前创建触发器 test_trigger 开始 select test_seq.nextval into :new.ROW_ID from dual;结束;

标签: sql-server-2005 triggers siebel


【解决方案1】:

我强烈建议不要修改 ROW_ID。使用不同的列,也许添加您自己的扩展列,但不要修改(或尝试设置自己)ROW_ID。将其保留为 Siebel 设置的值。

您不得修改任何系统列(键入“系统”,检查工具,在表 > 列中)

【讨论】:

  • 使用直接插入进行广告加载会绕过 Siebel 数据层,因为 OBIEE 直接将记录插入 S_CAMP_CON。
【解决方案2】:

这是我们做到这一点的一种方式。我们设置 OBIEE 以生成对当前负载唯一的 ROW_ID,因此 WHERE 子句可以获取要更新的记录。

IF EXISTS (SELECT name FROM sysobjects
      WHERE name = 'S_CAMP_CON_Direct_Load_ROW_ID' AND type = 'TR')
   DROP TRIGGER S_CAMP_CON_Direct_Load_ROW_ID
GO
CREATE TRIGGER S_CAMP_CON_Direct_Load_ROW_ID
ON S_CAMP_CON FOR INSERT
AS

UPDATE S_CAMP_CON
    SET ROW_ID = (select substring(replace (CAST (newid() as varchar(36)),'-',''),1,15))
   WHERE S_CAMP_CON.ROW_ID IN
   (SELECT ROW_ID FROM inserted WHERE INSERT_CD = 'Direct Load')

但我们担心ROW_ID 的唯一性,因为我们使用的是子字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-08-31
    • 2012-06-16
    • 1970-01-01
    相关资源
    最近更新 更多