在 SQL Server 2014 中自动插入行
Automatically inserted rows in SQL Server 2014
我是SQL服务器的新手,所以我直接问我的问题:
假设我有两个 tables
A
(a1 type1, ..., ai DATE, frequence INT, ...,aN typeN)
frequence
表示天数
B
(b1 type1,..., bi typei, ...., bN typeN)
我想做的是在 table A 上放置一种监听器,监听每一行的“'ai and frequence'”属性,然后将行插入 table B、例子:
- (v1, ...., "2016-03-01",30, ....,vN)一行tableA,所以在[=中增加了一行49=] B 从日期“2016-03-01”开始的每个月
所以在tableB上插入了一个新行:“2016-04-01”、“2016-05-01”、“2016-06-01”等等。
- 根据TableA中包含的信息可以计算出新插入的B行(插入只是一个过程的例子)
我已经在寻找这个问题,我找到的最相关的答案是使用触发器,但是触发器是在 INSERT/UPDATE/DELETE
之后或而不是 INSERT/UPDATE/DELETE
被触发的,并且这些操作是硬编码的,它不是启动流程的 DBMS(或上例中的当前日期),它是客户端。
欢迎大家提出意见。
谢谢,下回见。
在这种情况下,触发器可以正常工作。触发器确实在数据库级别触发,这意味着客户端无法绕过它。这似乎是您想要的,因为对此 table 的所有插入都将被触发器捕获。如果客户端向 Table A 中插入一条记录,则触发器将自动触发并根据您的逻辑将相关记录插入 Table B 中。我不知道你的完整逻辑,你需要检查月份等并确保它们不存在等。我将把它留作 reader 的练习。需要注意的是,存在一个名为 "inserted" 的虚拟 table,您可以检查它,这包括刚刚插入到 table 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
看起来您需要一个计划作业,因为您不希望行在插入 A 时插入 table B。计划作业可以调用存储过程或执行SQL直接查询。
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 上创建一个示例,但该网站现在似乎无法正常工作。
我是SQL服务器的新手,所以我直接问我的问题:
假设我有两个 tables
A
(a1 type1, ..., ai DATE, frequence INT, ...,aN typeN)frequence
表示天数
B
(b1 type1,..., bi typei, ...., bN typeN)
我想做的是在 table A 上放置一种监听器,监听每一行的“'ai and frequence'”属性,然后将行插入 table B、例子:
- (v1, ...., "2016-03-01",30, ....,vN)一行tableA,所以在[=中增加了一行49=] B 从日期“2016-03-01”开始的每个月
所以在tableB上插入了一个新行:“2016-04-01”、“2016-05-01”、“2016-06-01”等等。
- 根据TableA中包含的信息可以计算出新插入的B行(插入只是一个过程的例子)
我已经在寻找这个问题,我找到的最相关的答案是使用触发器,但是触发器是在 INSERT/UPDATE/DELETE
之后或而不是 INSERT/UPDATE/DELETE
被触发的,并且这些操作是硬编码的,它不是启动流程的 DBMS(或上例中的当前日期),它是客户端。
欢迎大家提出意见。
谢谢,下回见。
在这种情况下,触发器可以正常工作。触发器确实在数据库级别触发,这意味着客户端无法绕过它。这似乎是您想要的,因为对此 table 的所有插入都将被触发器捕获。如果客户端向 Table A 中插入一条记录,则触发器将自动触发并根据您的逻辑将相关记录插入 Table B 中。我不知道你的完整逻辑,你需要检查月份等并确保它们不存在等。我将把它留作 reader 的练习。需要注意的是,存在一个名为 "inserted" 的虚拟 table,您可以检查它,这包括刚刚插入到 table 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
看起来您需要一个计划作业,因为您不希望行在插入 A 时插入 table B。计划作业可以调用存储过程或执行SQL直接查询。
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 上创建一个示例,但该网站现在似乎无法正常工作。