2014-09-23 79 views
2

我试图建立一个INSERT触发器上类似下面的一个观点:SQL触发器插入到表

CREATE view [dbo].[PYC_ServiceAppointments] AS 
    SELECT 
     e.epUR as 'ClientUR', 
     codeDescription as 'Category', 
     s.serName as 'Service', 
     a.OccurrenceDate as 'StartDate', 
     a.EndDate as 'EndDate', 
     a.StartTime as 'StartTime', 
     a.EndTime as 'EndTime', 
     a.Confirmed as 'ServiceStatus', 
     a.Note as 'Note' 
    FROM 
     [ServiceAppointmentViewBase] a 
    INNER JOIN 
     Episode e ON e.cid = a.ClientID AND e.epRecent = '1' 
    INNER JOIN 
     [Service] s ON s.serID = a.ServiceID 
    LEFT JOIN 
     Codes c ON s.sCatCode = c.codecode AND c.codetype = 'SVC' 

我使用下表为其中的数据表插入:

CREATE TABLE [dbo].[ServiceAppointments] 
(  
    [SID] [int] IDENTITY(1,1) NOT NULL,  
    [ClientUR] [varchar](50) NULL,  
    [Category] [varchar](150) NULL,   
    [Service] [varchar](60) NULL,  
    [StartDate] [datetime] NULL,  
    [EndDate] [datetime] NULL,  
    [StartTime] [datetime] NULL,  
    [EndTime] [datetime] NULL, 
    [ServiceStatus] [bit] NULL,  
    [Note] [text] NULL, 

    PRIMARY KEY CLUSTERED ([SID] ASC)  
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,  
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 
TEXTIMAGE_ON [PRIMARY]  

这是我试图用它来执行插入触发器:

CREATE TRIGGER [dbo].[Trigger_Service] 
ON [PYC].[dbo].[PYC_ServiceAppointments] 
INSTEAD OF INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET ROWCOUNT 0; 

    INSERT INTO PYC.dbo.ServiceAppointments 
       ( 
       ClientUR, 
       Category, 
       [Service], 
       StartDate, 
       EndDate,-- = ISNULL(Getdate(), CurrentValues.EndDate)), 
       StartTime, 
       EndTime, 
       ServiceStatus, 
       Note) 
     SELECT 
      b.ClientUR, b.Category, b.[service], b.StartDate, b.EndDate, 
      b.StartTime, b.EndTime, b.ServiceStatus, b.Note 
     FROM  
      Inserted b 
END    

的数据库存储数据没有针对表的唯一ID,所以我试图完成的是当一个条目被添加到数据库中并且在视图中满足需求时,所以它填充了这个条目,它将触发触发器并使用SID(PK)为该行分配一个id,将该行添加到表中。

我已经在包含与指定表相同的列的测试表上尝试过相同的触发器,并且当条目添加到表时,触发器触发并将行添加到另一个表。

我对使用触发器相当新,所以任何帮助将不胜感激。

+1

备注:将在未来的SQL Server版本中删除'ntext','text'和'image'数据类型。避免在新的开发工作中使用这些数据类型,并计划修改当前正在使用它们的应用程序。改为使用'nvarchar(max)','varchar(max)'和'varbinary(max)'。 [详细信息在这里](http://msdn.microsoft.com/en-us/library/ms187993.aspx) – 2014-09-23 06:39:22

+3

行 - 所以你告诉我们你的整个设置 - 和**问题**是?这是行不通的,即给你一个错误?如果是这样:*什么*错误?还有什么是错的?一切似乎都是按顺序的,乍一看... – 2014-09-23 06:40:25

+0

为什么你有'SET ROWCOUNT 0;'?据我的理解,这意味着没有行会被处理。 – 2014-09-23 06:41:05

回答

1

如果我正确理解你的问题是,如果你的数据插入到ServiceAppointmentViewBase表中,你的触发器不起作用。这是正确的行为。您的触发器在视图上定义,因此只有通过此视图插入数据时才会触发。如果数据直接插入到表中而不使用视图PYC_ServiceAppointments,则不会被触发。当然,要通过视图插入数据,它必须是可更新的,或者像marc_s指出的那样,而不是触发器必须存在于这个视图上(就像你的情况一样)。

+0

*通过视图插入数据,它必须是可更新的* - 或者有一个INSTEAD OF INSERT触发器,因为OP正在做... – 2014-09-23 07:14:56

+0

@marc_s - 你是完全正确的,但它并没有改变这样的事实如果数据直接插入到基础表中,触发器将不会被触发。 – 2014-09-23 07:19:54

+0

绝对 - 我在OP的问题中错过了这个陈述(我盲目地认为,如果他在视图*上设置了触发器*,当然他会将数据*插入视图* .....) – 2014-09-23 07:20:49