Удаление таблиц в триггере 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