2022-12-01 PostgreSQL DB加密 改变所有表中某个字段的值

/*========================================================================
 ① Sample
 =========================================================================

CREATE OR REPLACE PROCEDURE public.cnamekna()
 LANGUAGE plpgsql
AS $procedure$ DECLARE 
/*------------------------------------------------------------------------------
  定数定義
  */
--
/*------------------------------------------------------------------------------
  変数定義
  */
--
WsSQL varchar(30000); 
--
/*------------------------------------------------------------------------------
  カーソル定義
  */
--
csrXCSQL CURSOR FOR 
select
    table_name AS TABNM
    , column_name AS COLNM
from
    information_schema.columns 
where
    table_name <> 'pg_stat_statements' 
    and table_schema = 'public' 
    and column_name = 'cnamekna' 
    and not exists
    (select 1
    FROM
        pg_views
    where
        schemaname='public'
    and viewname=table_name)
    union
    select t.relname AS TABNM,t.attname AS COLNM
from
    ( 
        select
            A.attname
            , C.relname
            , col_description(A.attrelid, A.attnum) AS COMMENT
            , format_type(A.atttypid, A.atttypmod) AS TYPE
            , A.attname AS NAME
            , A.attnotnull AS NOTNULL 
        FROM
            pg_class AS C
            , pg_attribute AS A 
        WHERE
            1 = 1 
            AND A.attrelid = C.oid 
            AND A.attnum > 0
    ) t 
where
    t.comment like '%カナ氏名%' 
    and t.attname <> 'cnamekna' 
    and t.type='character varying(40)'
    and not exists ( 
        select
            1 
        FROM
            pg_views 
        where
            schemaname = 'public' 
            and viewname = t.relname
    )
; 
/*========================================================================
  サブ・ルーチン
========================================================================*/
--
/*========================================================================
  メイン・ルーチン
========================================================================*/
BEGIN                                           --
-- // 開始ログの出力
  --CALL P_INS_PSLOG('INFO', '○開始○', 'cnamekna'); 
--
FOR rXCSQL IN csrXCSQL LOOP

        --SQL実行
         WsSQL := ' UPDATE ' 
        || rXCSQL.TABNM  
        || ' SET ' || rXCSQL.COLNM 
        || ' = '|| '''モヘジ''' 
        || ' WHERE ' || rXCSQL.COLNM || ' IS NOT NULL';
      EXECUTE WsSQL;
--
END LOOP; 
--
-- // 終了ログの出力
--CALL P_INS_PSLOG('INFO', '○終了○', 'cnamekna'); 
/*========================================================================
  メイン・ルーチン/例外処理
 ========================================================================*/
EXCEPTION                                       --
WHEN OTHERS THEN 
--CALL P_INS_PSLOG( 'ERROR', SQLSTATE || ':' || SQLERRM, 'cnamekna_SQL:'||WsSQL); 
--
RAISE; 
/*========================================================================
  メイン・ルーチン/終了
 ========================================================================*/
END; 

$procedure$
;

-- Permissions
/*========================================================================
 ➁ Sample
 =========================================================================

-- PROCEDURE: public.cshainno()

-- DROP PROCEDURE public.cshainno();

CREATE OR REPLACE PROCEDURE public.cshainno(
    )
LANGUAGE 'plpgsql'
AS $BODY$
DECLARE
/*------------------------------------------------------------------------------
  定数定義
  */
--
/*------------------------------------------------------------------------------
  変数定義
  */
--
QREC RECORD;
WsSQL1 varchar(30000);
WsSQL varchar(30000);
WsSQLT varchar;
WsSQLC varchar;

--
--
/*------------------------------------------------------------------------------
  カーソル定義
  */
--
csrXCSQL CURSOR FOR
select
    table_name AS TABNM
    , column_name AS COLNM
from
    information_schema.columns
where
    table_name <> 'pg_stat_statements'
    and table_schema = 'public'
    and column_name = 'cshainno'
    and not exists
    (select 1
    FROM
        pg_views
    where
        schemaname='public'
    and viewname=table_name)
    union
    select t.relname AS TABNM,t.attname AS COLNM
from
    (
        select
            A.attname
            , C.relname
            , col_description(A.attrelid, A.attnum) AS COMMENT
            , format_type(A.atttypid, A.atttypmod) AS TYPE
            , A.attname AS NAME
            , A.attnotnull AS NOTNULL
        FROM
            pg_class AS C
            , pg_attribute AS A
        WHERE
            1 = 1
            AND A.attrelid = C.oid
            AND A.attnum > 0
    ) t
where
    t.comment like '%職員番号%'
    and t.attname <> 'cshainno'
    and t.type='character varying(10)'
    and not exists (
        select
            1
        FROM
            pg_views
        where
            schemaname = 'public'
            and viewname = t.relname
    )
;

/*========================================================================
  サブ・ルーチン
========================================================================*/
--
/*========================================================================
  メイン・ルーチン  ========================================================================*/
BEGIN                                           --
-- // 開始ログの出力
  --CALL P_INS_PSLOG('INFO', '○開始○', 'CSHAINNO');
--
FOR rXCSQL IN csrXCSQL LOOP

       --SQL実行
         WsSQL := ' UPDATE '
        || rXCSQL.TABNM  
        || ' SET ' || rXCSQL.COLNM
        || ' = case when ' || rXCSQL.COLNM || '::numeric+11111 >9999999999 then ' || '''X''||' ||'substr(' || rXCSQL.COLNM  || '::numeric+11111 ,3,9)'
        || ' else ('|| rXCSQL.COLNM || '::numeric+11111)::varchar end'
        || ' where lf_to_number(' || rXCSQL.COLNM  || '::varchar) is not null';        
      EXECUTE WsSQL;
--
END LOOP;
--
-- // 終了ログの出力
--CALL P_INS_PSLOG('INFO', '○終了○', 'CSHAINNO');

/*========================================================================
  メイン・ルーチン/例外処理
 =======================================================================*/
EXCEPTION                                       --
WHEN OTHERS THEN
--CALL P_INS_PSLOG( 'ERROR', SQLSTATE || ':' || SQLERRM, 'CSHAINNO_SQL:'||WsSQL);
--
RAISE;
/*========================================================================
  メイン・ルーチン/終了
=======================================================================*/
END;
$BODY$;

GRANT EXECUTE ON PROCEDURE public.cshainno() TO postgres;

GRANT EXECUTE ON PROCEDURE public.cshainno() TO PUBLIC;


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值