Saya hanya akan mengatakan ini menjijikkan sebelum saya mulai. Jika Anda membuat skrip yang mengotomatiskan pembuatan basis data, saya akan membuang kueri di bawah ini dan hanya menyalin/menempelkan karena ini sangat mengerikan sehingga TIDAK termasuk dalam skrip penerapan basis data Anda.
Permintaan
DECLARE
CURSOR TABLES IS SELECT * FROM USER_TABLES
WHERE 0 = (SELECT COUNT(*)
FROM USER_CONSTRAINTS
WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME
AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
);
BEGIN
FOR T IN TABLES LOOP
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
||'FOR EACH ROW '||CHR(10)
||'BEGIN '||CHR(10)
||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
||'END; ';
END LOOP;
END;
/
Apa fungsinya?
Pada dasarnya, ia mendapat daftar tabel dan secara dinamis membangun SQL untuk melakukan berbagai tugas yang terlibat. EXECUTE IMMEDIATE
mengambil string tempat kami membangun SQL dan menjalankannya. CHR(10)
nastiness adalah baris baru. Saya ingin spasi putih di sana karena saya tidak tahu bagaimana membiarkannya keluar akan memengaruhi penguraian Oracle. Perhatikan bahwa di beberapa tempat kami menggabungkan nama tabel secara langsung ke beberapa teks lain untuk menghasilkan urutan atau nama batasan PK.
Ini mungkin atau mungkin tidak kesalahan jika Anda mengutip nama tabel Anda selama pembuatan dan menggunakan beberapa karakter huruf kecil. Jika TIDAK error, perlu diingat bahwa setiap pernyataan melibatkan komit. Kesalahan akan berarti prosesnya setengah selesai. Itu juga gagal jika skema bukan pengguna saat ini. (Anda harus mengubah USER_TABLES
ke ALL_TABLES
dan tambahkan filter yang sesuai di klausa where dan tambahkan skema di depan nama tabel saat membuat SQL untuk membuatnya berfungsi pada skema lain.)
SQLFiddle yang sebenarnya berfungsi:http://sqlfiddle.com/#!4/b67fc/1 (Saya tidak percaya ini benar-benar bekerja pada SQLFiddle.) Dalam hal ini, kueri yang kami minati sudah berakhir dalam definisi skema karena SQL Fiddle hanya mengizinkan SELECT
dalam kueri.
Semoga beruntung. Anda akan membutuhkannya. Jangan tembak kaki Anda sendiri.