Конвертировать триггер Oracle в SQL Server - PullRequest
2 голосов
/ 09 июня 2011

Я не знаком с триггерами MSSQL, мне нужно преобразовать триггер Oracle в MSSQL

вот триггер Oracle: -

create or replace trigger TRG_GRP_SEQ
before insert on T_USER_GROUP
for each row
begin
select count(*)  into :new.GROUPSEQUENCE from  T_USER_GROUP;
end;

У меня проблемы с прикрытием заявлений до, и для каждого нужна помощь.

Описание: этот триггер делает перед вставкой каждой строки в таблицу T_USER_GROUP, GROUPSEQUENCE будет увеличиваться на одно значение, определяющее общее количество (точно так же, как генерация идентификатора)

Спасибо.

Ответы [ 3 ]

1 голос
/ 09 июня 2011

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

Если у вас уже есть данные в таблице, вам нужно будет создать новую таблицу и заполнить ее следующим образом:

CREATE TABLE T_USER_GROUP_New (
   GroupSequence int identity(1,1) NOT NULL,
   <Other Columns ...>
);

SET IDENTITY_INSERT T_USER_GROUP_New ON;
INSERT T_USER_GROUP_New (GroupSequence, <OtherColumns ...>)
SELECT * FROM T_USER_GROUP;
SET IDENTITY_INSERT T_USER_GROUP_New OFF;

-- Add script here to drop FK constraints from any tables with an FK to T_USER_GROUP

EXEC sp_rename 'T_USER_GROUP', 'T_USER_GROUP_Old';
EXEC sp_rename 'T_USER_GROUP_New', 'T_USER_GROUP';

-- Add script here to recreate FK constraints from any tables with an FK to T_USER_GROUP

-- Add script here to add appropriate indexes and constraints to T_USER_GROUP
-- and rename or drop them from T_USER_GROUP_Old

Теперь вы можете полностью пропустить столбец GroupSequence при вставке, и он всегда получит следующее, увеличенное значение.Вы можете узнать это значение сразу после того, как:

DECLARE @NewGroupSequenceStart int,
   @NewGroupSequenceEnd int;

INSERT T_USER_GROUP (<Columns not including GroupSequence ...>)
VALUES (<Values ...>);
-- or SELECT <Columns ...> FROM Somewhere

SELECT @NewGroupSequenceStart = Scope_Identity(), @NewGroupSequenceEnd = @@RowCount;
SET @NewGroupSequenceEnd = @NewGroupSequenceEnd + @NewGroupSequenceStart - 1;

-- Now these two variables have the start and end GroupSequence IDs
-- that were newly generated (you can insert multiple rows).
-- This could probably be cleaned up a little but I don't have time to test now.
1 голос
/ 10 июня 2011

Я хотел бы пойти с Эриком,

Если вы определите

CREATE T_USER_GROUP (GROUPSEQUENCE INT IDENTITY(1, 1) NOT NULL, GROUP_NAME nvarchar(100), ...) 

вам не нужен такой триггер. IDENTITY (1,1) означает, что счетчик начинается с 1 и увеличивается на 1. На

INSERT T_USER_GROUP(GROUP_NAME)
VALUES('NewGroupName')

вы автоматически получите следующее более высокое значение в GROUPSEQUENCE.

1 голос
/ 09 июня 2011

Ниже должно быть близко к тому, что вы ищете. SQL Server не имеет триггеров BEFORE, поэтому вы должны использовать триггер INSTEAD OF и выполнить вставку в него. Кроме того, SQL Server не имеет построчных триггеров, все операции триггера основаны на наборе (вставленные / удаленные таблицы).

CREATE TRIGGER TRG_GRP_SEQ
ON T_USER_GROUP
INSTEAD OF INSERT
AS
INSERT INTO T_USER_GROUP (
  ..column list...
)
SELECT ...columns...,
       SELECT ROW_NUMBER() OVER(ORDER BY something) + (SELECT COUNT(*) FROM T_USER_GROUP),
       ...columns...
FROM inserted
...