2014-03-06 43 views
0

有人可以解釋爲什麼這工程 -MSSQL - 對於刪除觸發器不工作內部聯接

CREATE TRIGGER [dbo].[T_tskmst_D] 
    ON [dbo].[tskmst] 
    FOR DELETE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
     insert into [database].[dbo].[tskmst] (
      tskmst_revtm, tskmst_revtype, tskmst_id, tskmst_name, tskmst_desc, 
      tskmst_type, owner_id, tskmst_public, tskmst_lstchgtm, 
      nodmst_id, servicemst_id) 
     select GETDATE(), 'D', d.tskmst_id, d.tskmst_name, d.tskmst_desc, 
      d.tskmst_type, d.owner_id, d.tskmst_public, d.tskmst_lstchgtm, 
      d.nodmst_id, d.servicemst_id 
     from deleted d 
END 

但這並不 -

CREATE TRIGGER [dbo].[T_tskmst_D] 
    ON [dbo].[tskmst] 
    FOR DELETE 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for trigger here 
     insert into [database].[dbo].[tskmst] (
      tskmst_revtm, tskmst_revtype, tskmst_id, tskmst_name, tskmst_desc, 
      tskmst_type, owner_id, tskmst_public, tskmst_lstchgtm, 
      nodmst_id, servicemst_id) 
     select GETDATE(), 'D', d.tskmst_id, d.tskmst_name, d.tskmst_desc, 
      d.tskmst_type, d.owner_id, d.tskmst_public, d.tskmst_lstchgtm, 
      d.nodmst_id, d.servicemst_id 
     from deleted d 
       inner join tskmst tm on tm.tskmst_id = d.tskmst_id 
END 

我很困惑,爲什麼一個內部聯接在刪除將停止查詢能夠複製信息?是否因爲在內部連接發生之前數據被刪除?發生刪除之前是否可以複製數據?

我可以從刪除,但問題是一些表包含文本列(不問),所以我不能從刪除插入否則我缺少某些列。

回答

1

它不起作用,因爲如果它刪除觸發器。 這意味着已刪除的行在表中不存在。

當你加入沒有東西的東西時,你一無所獲。

+0

Thnx這就是我的想法。請問,那麼有沒有辦法從刪除的東西中複製文本列?如果我從插入到刪除,我必須排除文本列。 – whoisearth

+0

我不明白爲什麼你必須排除文本列。 – GriGrim

+0

,因爲如果您嘗試插入或插入使用插入或刪除的文本列,則失敗。 ntext不是可以使用的有效列。 – whoisearth