2014-03-06 45 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