将Oracle触发器转换为SQL Server

时间:2011-06-09 07:45:55

标签: sql-server oracle triggers sql-server-2000

我不熟悉我需要将Oracle触发器转换为MSSQL的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将递增一个值,确定总计数(就像ID生成一样)

感谢。

3 个答案:

答案 0 :(得分:1)

下面应该接近你所追求的。 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

答案 1 :(得分:1)

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.

答案 2 :(得分:1)

我想和Erik一起去,

如果你定义

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中的下一个更高值。