2014-09-23 80 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