始める前に、これはひどいことだと言うつもりです。データベースの作成を自動化するスクリプトを作成している場合は、以下のクエリを破棄して、データベース展開スクリプトに属さないほどひどいので、コピー/貼り付けを行います。
クエリ
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
へ SQLをビルドするときに、where句に適切なフィルターを追加し、テーブル名の前にスキーマを追加して、別のスキーマで機能するようにします。)
実際に機能するSQLFiddle: http://sqlfiddle.com/#!4/b67fc/1 (これが実際にSQLFiddleで機能したとは信じられません。)この場合、SQLFiddleではSELECT
しか許可されていないため、目的のクエリはスキーマ定義で終了します。 クエリで。
幸運を。あなたはそれを必要とするでしょう。足を撃たないでください。