创建SQL Server触发器错误
我犯了一个错误,弄不清我做错了什么。我在一个表上创建一个触发器来每天存档这个表。表被截断,每天早上插入新数据。一旦发生这种情况,我想将其存档 这是我创建触发器的代码:创建SQL Server触发器错误,sql,sql-server,triggers,Sql,Sql Server,Triggers,我犯了一个错误,弄不清我做错了什么。我在一个表上创建一个触发器来每天存档这个表。表被截断,每天早上插入新数据。一旦发生这种情况,我想将其存档 这是我创建触发器的代码: IF OBJECT_ID('trg_archive_inventory_table') IS NOT NULL DROP TRIGGER trg_archive_inventory_table GO CREATE TRIGGER trg_archive_inventory_table ON inventory AFTE
IF OBJECT_ID('trg_archive_inventory_table') IS NOT NULL
DROP TRIGGER trg_archive_inventory_table
GO
CREATE TRIGGER trg_archive_inventory_table
ON inventory
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
/* delete data from one year ago */
DELETE FROM [cadc].[dbo].[inventory_archive]
WHERE entry_date = CAST((DATEADD(yy, -1, GetDate())) as DATE);
/* insert todays inventory */
INSERT INTO [cadc].[dbo].[inventory_archive] (sku, tag_id , load_id, batch, status, qc_status, location, eaches, units, cartons, r_date, e_date, zone_1, zone_2, loc_type, loc_pick, mod_time, receiver_no, mfg_code, each_unit, unit_carton)
SELECT
sku, tag_id , load_id, batch, status, qc_status, location, eaches,
units, cartons, r_date, e_date, zone_1, zone_2, loc_type, loc_pick,
mod_time, receiver_no, mfg_code, each_unit, unit_carton
FROM
[cadc].[dbo].[inventory];
END
我不断得到以下错误:
“创建/更改触发器”不允许将数据库名称指定为对象名称的前缀
我还尝试在库存表前面加上[cadc].[dbo].[inventory]前缀,但收到了相同的错误
谷歌有助于理解这个问题
任何帮助都会很好。我需要将数据库设置在触发器上方
IF OBJECT_ID('trg_archive_inventory_table') IS NOT NULL
DROP TRIGGER trg_archive_inventory_table
GO
USE cadc;
GO
CREATE TRIGGER trg_archive_inventory_table ON inventory AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @lastrun date;
/* make sure the inventory table was updated this morning*/
SELECT @lastrun = MAX(entry_date) FROM [cadc].[dbo].[inventory_archive];
IF (@lastrun < CAST(GETDATE() as date))
BEGIN
/* delete data from one year ago */
DELETE FROM [cadc].[dbo].[inventory_archive] WHERE entry_date = CAST((DATEADD(yy, -1, GetDate())) as DATE);
/* insert todays inventory */
INSERT INTO [cadc].[dbo].[inventory_archive] (sku, tag_id , load_id, batch, status, qc_status, location, eaches, units, cartons, r_date, e_date, zone_1, zone_2, loc_type, loc_pick, mod_time, receiver_no, mfg_code, each_unit, unit_carton)
SELECT sku, tag_id , load_id, batch, status, qc_status, location, eaches, units, cartons, r_date, e_date, zone_1, zone_2, loc_type, loc_pick, mod_time, receiver_no, mfg_code, each_unit, unit_carton
FROM [cadc].[dbo].[inventory];
END
END
正如上面@marc_s所指出的,我将尝试将其转移到运行的作业中。请注意:每当该操作发生时,都会触发触发器-您无法控制触发的时间和次数。因此,它应该尽可能精简,不应该执行任何广泛的操作,如归档。类似这样的东西-每天存档此表-听起来更适合计划的SQL Server代理作业,该作业可以每天或晚上启动一次以完成其任务强烈同意marc_的观点,不要为此使用触发器。这应该是一个每晚的过程,为此计划一个窗口作业正如我所说的-这不应该是一个触发器开始。但是错误信息似乎很清楚-不能对表使用三部分名称-[cadc].[dbo].[inventory]-必须将自己限制为两部分名称模式+对象名称-[dbo].[inventory]@marc_s好的,我没有权限将其设置为SQL代理作业,这就是我使用触发器的原因。我确信将数据导入到库存表的作业每天只运行一次。我有一个检查,看看表是否已经存档,所以我知道它不会在一天内完成两次。我理解为什么我想分开这两个进程,并将与我的数据库管理员交谈。谢谢,我将使用cadc移到脚本的开头。否则,如果触发器已经存在,但您在另一个数据库中启动脚本,它将无法执行CREATETRIGGER语句。