Bagikan melalui


O2SS0028: Kolom ROWID yang dihasilkan (Info)

Artikel ini menjelaskan alasan mengapa Asisten Migrasi SQL Server (SSMA) untuk Oracle menambahkan ROWID kolom ke tabel, jika ada pemicu.

Latar belakang

Di Oracle, Anda dapat membuat pemicu yang berjalan FOR EACH ROW, bukan untuk seluruh set baris yang berubah. Di SQL Server, pemicu selalu dijalankan untuk seluruh set baris yang dimodifikasi. Jika pemicu Oracle tingkat baris mengakses variabel - :old dan :new khusus, maka SSMA memerlukan cara untuk mencocokkan baris dari kedua set baris untuk mengidentifikasi nilai untuk baris tertentu sebelum dan sesudah pembaruan. Untuk meniru fungsionalitas setiap baris, SSMA menambahkan kolom khusus ROWID untuk mengidentifikasi setiap baris yang dimodifikasi secara unik dan menggunakannya untuk membangun hubungan antara inserted set baris dan deleted .

Contoh

Dalam contoh berikut, pemicu Oracle dijalankan untuk setiap baris yang diperbarui dalam TRIG_TEST tabel:

CREATE OR REPLACE TRIGGER TSCHM.TRIG_TEST_AU
AFTER UPDATE OF DATA ON TSCHM.TRIG_TEST
FOR EACH ROW
BEGIN
    IF (:new.DATA = 'ABC') THEN
        INSERT INTO TSCHM.TRIG_TEST(DATA) VALUES ('-' || :old.DATA);
    END IF;
END;

Ketika Anda mencoba mengonversi pemicu ini di SSMA, T-SQL berikut diproduksi dalam pemicu SQL Server:

  1. Jalankan kursor di atas inserted set baris, memilih dan DATA kolom ROWID ke dalam @new$0 variabel dan @new$DATA :

    DECLARE
        ForEachInsertedRowTriggerCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY FOR
        SELECT ROWID, DATA
        FROM inserted
    
    OPEN ForEachInsertedRowTriggerCursor
    
    FETCH ForEachInsertedRowTriggerCursor
        INTO @new$0, @new$DATA
    
  2. Dalam perulangan, pilih baris yang cocok dari deleted baris yang diatur ke dalam @old$0 variabel dan @old$DATA , berdasarkan yang disisipkan ROWID (disimpan dalam @new$0 variabel):

    SELECT @old$0 = ROWID, @old$DATA = DATA
    FROM deleted
    WHERE ROWID = @new$0
    
  3. Lakukan tindakan pemicu menggunakan @old$DATA/@new$DATA variabel:

    IF (@new$DATA = 'ABC')
        INSERT SSMAADMIN.TRIG_TEST(DATA)
        VALUES (('-' + ISNULL(@old$DATA, '')))
    

Informasi Tambahan

Perilaku ini dikontrol oleh pengaturan buat proyek kolom ROWID, yang dapat ditemukan di bawah Proyek Alat>Pengaturan> Pembuatan ROWID Konversi>Umum.> Jika pengaturan diatur ke Tidak, tetapi selama konversi pemicu SSMA mengidentifikasi bahwa pengaturan memerlukan ROWID kolom, maka kesalahan konversi O2SS0239 dihasilkan.