Удаление таблиц в триггере AFTER INSERT

Я ищу предложения о том, как обрабатывать входящие данные из клиентского приложения C#, которое отправляет через System.Data.SqlClient.SqlBulkCopy. Первоначальная цель состояла в том, чтобы сохранить все данные, отправленные через приложение, на наш 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

Теперь я собираюсь использовать немного по-другому, и мне нужно удалить все из таблицы "Перейти к". Моя самая большая таблица будет около 350000 записей. Я намереваюсь DROP и заново СОЗДАТЬ упомянутую таблицу следующим образом: (этот метод работает нормально, смотрите мои вопросы ниже)

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

Кто-нибудь видит какие-либо проблемы с этим методом? Есть разные предложения? Может кто-нибудь объяснить, когда и как индексировать вновь воссозданную таблицу?

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
Другие вопросы по тегам