Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建SQL Server触发器错误_Sql_Sql Server_Triggers - Fatal编程技术网

创建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语句。