SQL Server 2014中自动插入的行

时间:2016-03-01 01:31:09

标签: sql sql-server triggers rdbms jobs

我是SQL Server的新手,所以我会直接问我的问题:

假设我有两张桌子

  • A(a1 type1,...,ai DATE,frequency INT,...,aN typeN)
    • frequence代表天数
  • B(b1 type1,...,bi typei,....,bN typeN)

我想要做的是在表A上放置一种监听器来监听每行的“ai和频率”属性,然后将行插入表B中,例如:

  1. (v1,....,“2016-03-01”,30,....,vN)表A的一行,因此从日期开始每个月都会向表B添加一个新行“2016年3月1日”
  2. 因此在表B中插入一个新行:“2016-04-01”,“2016-05-01”,“2016-06-01”等等。

    1. 新插入的B行可以根据表A中包含的信息计算(插入只是一个过程的示例)
    2. 我已经找到了这个问题,我找到的最相关的答案是使用触发器,但触发器在INSERT/UPDATE/DELETE之后或之后触发,而这些操作是硬编码的,它不是DBMS (或上面示例中的当前日期)启动流程,它是客户端。

      欢迎发表评论。

      谢谢你,很快就会在下面见到你。

2 个答案:

答案 0 :(得分:1)

在这种情况下,触发器可以正常工作。触发器在数据库级别触发,这意味着客户端无法绕过它。这似乎是你想要的,因为触发器会捕获到此表的所有插入。如果客户端将记录插入表A,则触发器将自动触发并根据您的逻辑将相关记录插入表B中。我不知道你的完整逻辑,你需要检查几个月等,并确保它们还没有存在等等。我将此作为练习留给读者。需要注意的是一个名为"插入的虚拟表"存在,您可以检查,这包括刚刚插入表A的所有行。

CREATE TRIGGER insertNewMonth
   ON  A
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
    insert B (b1, bi, bN)
    Select a1, a1, aN
    from inserted
END
GO

答案 1 :(得分:1)

看起来您需要一个预定作业,因为您不希望在将它们插入A时将行插入到表B中。预定作业可以调用存储过程或直接执行SQL查询。 / p>

以下是creating a stored procedure的语法:

CREATE PROCEDURE BuildBFromA
AS 
BEGIN
    DECLARE @Numbers TABLE
    (
         Number int Primary Key
    )

    --You get the idea
    INSERT into @Numbers
    VALUES (0),(1),(2),(3)

    --Put your insert query here.
    insert B (b1, bi, bN)
    Select a1, a1, aN
    from a
    join @Numbers n on 1=1
    where DATEADD(a.aN,n.Number,a.ai) = convert(date,getdate())
END
GO

以下是adding a scheduled job的语法:

USE msdb ;
GO
EXEC dbo.sp_add_job
    @job_name = N'Build B' ;
GO
EXEC sp_add_jobstep
    @job_name = N'Build B',
    @step_name = N'Insert Rows in B based on A',
    @subsystem = N'TSQL',
    @command = N'EXECUTE BuildBFromA', 
    @retry_attempts = 5,
    @retry_interval = 5 ;
GO
EXEC dbo.sp_add_schedule
    @schedule_name = N'RunEveryMinute',
    @freq_type = 4,
    @active_start_time = 233000;
USE msdb ;
GO
EXEC sp_attach_schedule
   @job_name = N'Build B',
   @schedule_name = N'RunEveryMinute';
GO
EXEC dbo.sp_add_jobserver
    @job_name = N'Build B';
GO

通常我会在SQLFiddle.com上创建一个示例,但该网站现在似乎不起作用。