2011-06-09 4 views
2

に変換すると、私はMSSQLは、Oracleのトリガーは、私はMSSQLに慣れていないよ、SQL Serverの

へのOracleトリガーを変換する必要がトリガーここで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; 

私はトラブルカバーによ前のステートメントとそれぞれのためにいくつかの援助の手が必要です。

説明:このトリガーはないGROUPSEQUENCE T_USER_GROUPテーブルの各行を挿入すること(単にID生成など)総数

おかげを決定する一つの値だけインクリメントする前です。

+0

私たちはOracle以外の専門家のために、上記のトリガーが何をするのか説明できますか? –

+0

私の質問が更新されました。 – Switch

+0

ありがとう、今私には意味がある。 :):new.GROUPSEQUENCEは、おそらく新しい行のGROUPSEQUENCE列への参照です。 –

答えて

1

SQL Serverは、彼らが新たに挿入された行のためにオートインクリメントを意味している列identityを作ることができます。私はあなたがトリガーを完全になくすことができるように1つを使用することをお勧めします。

すでにテーブル内のデータを持っている場合、あなたは新しいテーブルを作成し、そのようにそれを埋めるために定義されます:

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

以下はあなたの後ろのものに近いべきです。 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 
+0

MSSQL 2000ではROW_NUMBER()関数はサポートされていません – Switch

+1

これでロックする必要があるか、または何かが爆発することになります。 – ErikE

+0

@エリク - それに完全に同意する、そのような解決策はn次までテストされるべきです! –

1

私はエリックと一緒に行きたいと思い、

あなたは

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

を定義する場合は、トリガーのこの種の必要はありません。 IDENTITY(1,1)はカウンタを使用すると、GROUPSEQUENCEで自動的に次のより高い値を取得します

INSERT T_USER_GROUP(GROUP_NAME) 
VALUES('NewGroupName') 

1.により1インクリメントから始まることを意味しています。

関連する問題