0

Я пытаюсь написать Удалить Trigger для оптимизированной таблицы памяти в SQL Server 2016 RC 2Удаление триггера для оптимизации памяти таблицы

CREATE TRIGGER [dbo].[TestCascadeDelete] 
ON [CAMSII].[dbo].[Table1] 
WITH NATIVE_COMPILATION, SCHEMABINDING 
FOR DELETE 

AS BEGIN ATOMIC WITH 
(
TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' 
) 

DELETE [dbo].[Table2] 
WHERE [dbo].[Table2].Id IN(SELECT Id from DELETED) 

END 
GO 

Когда я бегу этот вопрос я получаю следующее сообщение об ошибке. Подзапросы (запросы, вложенные в другой запрос) поддерживаются только в операторах SELECT с изначально скомпилированными модулями.

+0

'DELETE FROM [DBO] [Table2] FROM dbo.Table2 AS t2 РЕГИСТРИРУЙТЕСЬ удален д ON t2.Id = d.id' – lad2025

+0

@ lad2025 I попробовал это до и снова пробовал это, но FROM CLause также не разрешено в Native Compiled Modules. Вот новая ошибка 'Использование предложения FROM в инструкции UPDATE и указание источника таблицы в операторе DELETE не поддерживается с использованием скомпилированных модулей.' –

ответ

0

Обходным путем является использование переменной таблицы и повторение по строкам с циклом WHILE. Вот пример для UPDATE с FROM обходного:

DROP TABLE IF EXISTS dbo.table1 
GO 
DROP TYPE IF EXISTS dbo.type1 
GO 


CREATE TABLE dbo.table1 
(Id INT NOT NULL PRIMARY KEY NONCLUSTERED, 
c2 INT NOT NULL, 
LastUpdated DATETIME2 NOT NULL DEFAULT (SYSDATETIME())) 
WITH (MEMORY_OPTIMIZED=ON) 
GO 
CREATE TYPE dbo.type1 AS TABLE 
(Id INT NOT NULL, 
c2 INT NOT NULL, 
RowID INT IDENTITY, 
    INDEX ix_RowID (RowID DESC)) 
WITH (MEMORY_OPTIMIZED=ON) 
GO 
CREATE TRIGGER dbo.tr_table1 
    ON dbo.table1 
    WITH NATIVE_COMPILATION, SCHEMABINDING 
    AFTER UPDATE 
AS BEGIN ATOMIC WITH 
(
TRANSACTION ISOLATION LEVEL = SNAPSHOT, LANGUAGE = N'us_english' 
) 
    -- original UPDATE with FROM statement: 
    --UPDATE dbo.table1 
    --SET LastUpdated = SYSDATETIME() 
    --FROM dbo.table1 t JOIN Inserted i ON t.Id=i.Id 

    DECLARE @tv dbo.type1 
    INSERT @tv (Id, c2) 
    SELECT Id, c2 FROM Inserted 


    -- workaround that iterates over the rows in the table variable, simulating a cursor: 
    DECLARE @max INT = SCOPE_IDENTITY() 

    DECLARE @i INT = 1 
    DECLARE @Id INT 

    WHILE @i <= @max 
    BEGIN 
     SELECT @Id = Id 
     FROM @tv 
     WHERE [email protected] 

     UPDATE dbo.table1 
     SET LastUpdated = SYSDATETIME() 
     WHERE Id = @Id 

     SET @i += 1 
    END 

END 
GO 

INSERT dbo.table1 (Id, c2) VALUES (1,2) 
INSERT dbo.table1 (Id, c2) VALUES (2,2) 
GO 
SELECT * FROM dbo.table1 
GO 
UPDATE dbo.table1 
SET c2 = 3 
GO 
SELECT * FROM dbo.table1 
GO 
0

Я сделал простой трюк сегодня для работы вокруг этого, так как я не могу использовать подзапросы в изначально скомпилированный хранимой процедуры.

Сценарий Удалить из таблиц Master ребенка:.

row exist in parent -> capture id; 

while (rowcount <> 0) 
begin 
     delete from child where id = idcaptured; 
     delete from master where id = idcaptured; 

     row exist in parent -> capture id; 
end; 
Смежные вопросы