Просто ще кажа, че това е отвратително, преди да започна. Ако създавате скриптове, които автоматизират създаването на база данни, бих се отказал от заявката по-долу и просто ще използвам копиране/поставяне, защото това е толкова ужасно, че НЕ принадлежи на вашите скриптове за внедряване на база данни.
Заявката
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;
/
Какво прави това?
По принцип той получава списък от таблици и динамично изгражда SQL, за да изпълнява различните включени задачи. EXECUTE IMMEDIATE
взема низа, където сме създали SQL, и го изпълнява. CHR(10)
гадостта е нов ред. Исках празното място там, защото не знам как оставянето му ще повлияе на анализирането на Oracle. Имайте предвид, че на няколко места свързваме името на таблицата директно с някакъв друг текст, за да генерираме последователност или име на PK ограничение.
Това може или не може да доведе до грешка, ако сте цитирали имената на вашите таблици по време на създаването и използвате някои малки букви. Ако НАПРАВИ грешка, имайте предвид, че всеки оператор включва ангажимент. Грешка ще означава, че процесът е наполовина завършен. Също така се проваля, ако схемата не е текущият потребител. (Ще трябва да промените USER_TABLES
към ALL_TABLES
и добавете подходящ филтър в клаузата where и добавете схемата пред името на таблицата, когато създавате SQL, за да може да работи с друга схема.)
Действително работещ SQLFiddle:http://sqlfiddle.com/#!4/b67fc/1 (Не мога да повярвам, че това действително работи на SQLFiddle.) В този случай заявката, която ни интересува, е в дефиницията на схемата, тъй като SQL Fiddle позволява само SELECT
в заявката.
Късмет. Ще ти трябва. Не се прострелвайте в крака.