创建触发器以首先自动在其他表中插入行

时间:2013-07-04 10:06:36

标签: sql triggers sql-server-2012

我的SQL 2012 DB中有两个表。表:航程和国家。

表Voyages包含信息“destinationID”(表示相应的countryID)。正在从包含国家/地区名称的文本文件导入Voyages的数据。 我想要实现的目标如下:

  1. 当一个新行被添加到Voyages表中时,一个新行将首先添加到Countries表中(生成一个新的countryID并插入该国家的名称)。
  2. 添加新的国家/地区行时,生成的countryID将用于插入新的Voyages行(将countryID设置为destinationID)。
  3. 我知道我可以通过解析文本文件,提取国家/地区名称并将其添加到数据库以获取新的countryID来在我的应用程序中执行此操作。然后我可以使用新ID添加新的Voyages行。但我还可以在DB中完成整个工作吗?我想过使用Trigger。

    但是我会遇到问题,我最初必须在Voyages表中插入一个国家/地区名称字符串,而最后我想插入一个countryID(int)。

    这将是某种我真的不喜欢的解决方法:

    INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (1, 0, "BRAZIL");
    

    像这样,我可以创建一个Trigger(INSTEAD OF INSERT)来提取destinationString以插入一个新的国家行:

    INSERT INTO countries (countryName) VALUES ("BRAZIL");
    

    然后可以在我的触发器中使用生成的countryID(例如27)来最终将新行插入到航行中:

    INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (1, 27, NULL);
    

    还有更优雅的方法吗?

    非常感谢!

1 个答案:

答案 0 :(得分:1)

我在评论中提到了存储过程作为此类问题的最佳解决方案。以下是它的外观示例:

CREATE PROCEDURE uspInsertVoyage
(
    @voyageID INT, 
    @destinationString NVARCHAR(50)
)
AS
BEGIN

    DECLARE @destinationID INT;

    IF NOT EXISTS (SELECT * FROM Countries WHERE countryName = @destinationString)
    BEGIN
        INSERT INTO countries (countryName) VALUES (@destinationString)
    END;

    SELECT @destinationID = countryID FROM Countries WHERE countryName = @destinationString;

    INSERT INTO voyages (voyageID, destinationID, destinationString) VALUES (@voyageID, @destinationID, NULL);

END