【问题标题】:Dropping Tables within an AFTER INSERT Trigger在 AFTER INSERT 触发器中删除表
【发布时间】:2013-06-07 20:50:54
【问题描述】:

我正在寻找有关如何处理来自通过 System.Data.SqlClient.SqlBulkCopy 发送的 C# 客户端应用程序的传入数据的建议。最初的意图是维护所有通过应用程序发送到我们的 sql 服务器的数据,这些数据将被“按摩”。为了保证安全,数据仅发送到写入表,其中 AFTER INSERT 触发器将复制到另一个表并删除传入的数据。

简单示例:

ALTER TRIGGER [dbo].[FromWeb_To_MyTable] ON [dbo].[_FromWeb_MyTable]
AFTER INSERT
AS 
BEGIN
   SET NOCOUNT ON;

   INSERT INTO [dbo].[MyTable]([MyTableID],[MemberID],[LocationID],[ODBCID],[InsertDateTime])
   SELECT i.[MyTableID],i.[MemberID],i.[LocationID],i.[ODBCID],i.[InsertDateTime]
   FROM Inserted i;

   DELETE FROM _FromWeb_MyTable
   WHERE [MyTableID] IN (SELECT i.[MyTableID] FROM Inserted i);
END

现在我将使用一些不同的方法,需要删除“转到”表中的所有内容。我最大的表将是大约 350,000 条记录。我打算像这样删除并重新创建所述表: (此方法运行良好,请参阅下面的问题)

ALTER TRIGGER [dbo].[FromWeb_To_MyTable] ON [dbo].[_FromWeb_MyTable]
AFTER INSERT
AS 
BEGIN
   SET NOCOUNT ON;

   IF EXISTS(SELECT [name] FROM sys.TABLES WHERE [name] = 'MyTable') DROP TABLE [dbo].[MyTable];
   CREATE TABLE [dbo].[MyTable] (
      [MyTableID] [int] NOT NULL,
      [MemberID] [varchar](6) NOT NULL,
      [LocationID] [varchar](50) NOT NULL,
      [ODBCID] [varchar](50) NOT NULL,
      [InsertDateTime] [datetime] NOT NULL
   ) on [PRIMARY];

   INSERT INTO [dbo].[MyTable] ( [MyTableID], [MemberID],[LocationID],[ODBCID],[InsertDateTime] )
   SELECT i.[MyTableID],i.[MemberID],i.[LocationID],i.[ODBCID],i.[InsertDateTime]
   FROM Inserted i;

   DELETE FROM _FromWeb_MyTable
   WHERE [MyTableID] IN (SELECT [MyTableID] FROM Inserted);
END

有人发现这种方法有什么问题吗?有什么不同的建议吗?有人能解释一下何时以及如何索引新创建的表吗?

【问题讨论】:

    标签: sql-server tsql drop-table


    【解决方案1】:

    由于您重复使用表而不是删除并重新创建它,因此只需使用 TRUNCATE

    ALTER TRIGGER dbo.FromWeb_To_MyTable ON dbo._FromWeb_MyTable
    AFTER INSERT
    AS 
    BEGIN
       SET NOCOUNT ON;
    
       TRUNCATE TABLE dbo.MyTable;
    
       INSERT INTO dbo.MyTable (MyTableID, MemberID,LocationID,ODBCID,InsertDateTime)
       SELECT i.MyTableID,i.MemberID,i.LocationID,i.ODBCID,i.InsertDateTime
       FROM Inserted i;
    
       DELETE FROM _FromWeb_MyTable
       WHERE MyTableID IN (SELECT MyTableID FROM Inserted);
    END
    

    【讨论】:

    • 谢谢你的提示,彼得!
    猜你喜欢
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多