sql >> データベース >  >> RDS >> PostgreSQL

相互依存関係のあるSQLスクリプトの実行

    他に依存しないすべてのビューで開始し、これらに依存するビューを再帰的に追加する単純な再帰クエリを作成できます。次に、これらのビューのビュー定義を正しい順序で出力すると、スクリプトが作成されます。

    WITH RECURSIVE viewids AS (
       /* all views that don't depend on other views */
       SELECT t.oid, 1 as level
       FROM pg_class t
          JOIN pg_rewrite AS r ON r.ev_class = t.oid
       WHERE r.rulename = '_RETURN'
         AND t.relkind = 'v'
         AND t.relnamespace NOT IN ('pg_catalog'::regnamespace,
                                    'information_schema'::regnamespace,
                                    'pg_toast'::regnamespace)
         AND NOT EXISTS (
                /* depends on a view */
                SELECT 1
                FROM pg_depend AS d
                   JOIN pg_class AS t2 ON d.refobjid = t2.oid
                WHERE d.objid = r.oid
                  AND d.classid = 'pg_rewrite'::regclass
                  AND d.refclassid = 'pg_class'::regclass
                  AND d.deptype = 'n'
                  AND d.refobjsubid <> 0
                  AND t2.relkind = 'v'
             )
         AND NOT EXISTS (
                /* depends on an extension */
                SELECT 1
                FROM pg_depend
                WHERE objid = t.oid
                  AND classid = 'pg_class'::regclass
                  AND refclassid = 'pg_extension'::regclass
                  AND deptype = 'e'
             )
    UNION ALL
       /* all views that depend on these views */
       SELECT t.oid, viewids.level + 1
       FROM pg_class AS t
          JOIN pg_rewrite AS r ON r.ev_class = t.oid
          JOIN pg_depend AS d ON d.objid = r.oid
          JOIN viewids ON viewids.oid = d.refobjid
       WHERE t.relkind = 'v'
         AND r.rulename = '_RETURN'
         AND d.classid = 'pg_rewrite'::regclass                            
         AND d.refclassid = 'pg_class'::regclass
         AND d.deptype = 'n'
         AND d.refobjsubid <> 0
    )
    /* order the views by level, eliminating duplicates */
    SELECT format('CREATE VIEW %s AS%s',
                  oid::regclass,
                  pg_get_viewdef(oid::regclass))
    FROM viewids
    GROUP BY oid
    ORDER BY max(level);
    



    1. SQLでのREPLACEとINSERT

    2. IDを生成した後、Magentoが顧客の保存に失敗するのはなぜですか?

    3. mySQLをAndroidに接続する

    4. FuelPHPオイル移行が機能しない