将数据从源数据迁移到新关系中?

问题描述 投票:0回答:1

我有三个表:folderfolder_groupfolder_group_permission

这些是源表,我需要将数据卸载到新表中的新模式,其中表中的逻辑略有不同accessaccess_groupaccess_group_permission

各表之间的关系如下:

表访问通过ID链接到表access_group:access.id = access_group.access_id。

表access_group通过以下关系链接到表access_group_permission:access_group.id = access_group_permission.access_group_id。

表文件夹链接到表folder_group:folder.id =folder_group.folder_id。

表folder_group链接到表folder_group_permission:folder_group.id =folder_group_permission.folder_group_id。

access                                                       folder
+----+-----------------+-----------+                        +----+--------------+
| id | access_type_id  | id_entity |                        | id | folder_name  |
+----+-----------------+-----------+                        +----+--------------+
| 1  | 3               | 1         |                        | 1  | 3            |
| 2  | 3               | 2         |                        +----+-------- -----+
| 3  | 3               | 3         |                        
+----+-----------------+-----------+                        
access_group                                                 folder_group
+----+-----------------+-----------+                        +----+-----------------+-----------+
| id |     group_id    | access_id |                        | id |     group_id    | folder_id |
+----+-----------------+-----------+                        +----+-----------------+-----------+
| 1  | 2               | 1         |                        | 1  | 2               | 1         |
| 2  | 2               | 1         |                        | 2  | 2               | 1         |
| 3  | 2               | 3         |                        | 3  | 2               | 3         |
+----+-----------------+-----------+                        +----+-----------------+-----------+
access_group_permission                                      folder_group_permission
+----+-----------------+-----------------+             +----+-----------------+-----------------+
| id | access_group_id | permission_code |             | id | folder_group_id | permission_code |
+----+-----------------+-----------------+             +----+-----------------+-----------------+
| 1  | 1               | view            |             | 1  | 1               | view            |
| 2  | 1               | edit            |             | 2  | 1               | edit            |
| 3  | 2               | view            |             | 3  | 2               | view            |
+----+-----------------+-----------------+             +----+-----------------+-----------------+

在这里您可以看到表格。访问表中的 id_entity 将包含所有folder_ids,因此该表可以为所有实体授予权限,即使它不是文件夹。因此,访问表具有所有实体及其访问类型,access_group表具有所有access_ids和group_id,access_group_permission通过access_group表连接到访问表并为每个实体授予权限。 在这个关系上,我想输入文件夹、文件夹组和文件夹组权限。

这是我整个迁移的脚本。我知道我的解决方案很糟糕,有人可以帮助我,我该怎么做。我完全困惑了=(。请给出一些如何完成的想法

DO $$
    DECLARE
        conn text := 'dbname= host= user= password=';
        max_access_id INT;
        max_access_group_id INT;
    BEGIN
        PERFORM dblink_connect('db_connection', conn);

        SELECT COALESCE(MAX(id), 0) INTO max_access_id FROM access_control.public.access;
        SELECT COALESCE(MAX(id), 0) INTO max_access_group_id FROM access_control.public.access_group_permission;

        INSERT INTO access_control.public.access (id, access_type_id, id_entity)
        SELECT
            max_access_id + ROW_NUMBER() OVER () AS id,
            (SELECT id FROM access_type WHERE type_name = 'folder') AS access_type_id,
            f.id AS id_entity
        FROM
            dblink('db_connection',
                   'SELECT id
                    FROM folder') AS f(
                                       id BIGINT
                )
        ON CONFLICT (access_type_id, id_entity) DO NOTHING;
        
        

        INSERT INTO access_control.public.access_group (id, group_id, access_id)
        SELECT
            (SELECT COALESCE(MAX(id), 0) FROM access_control.public.access_group) + ROW_NUMBER() OVER () AS id,
            fg.group_id,
            max_access_id + ROW_NUMBER() OVER () AS access_id
        FROM
            dblink('db_connection',
                   'SELECT group_id, folder_id
                    FROM folder_group') AS fg(
                                              group_id BIGINT,
                                              folder_id BIGINT
                                              
                );

        
        INSERT INTO access_control.public.access_group_permission (id, access_group_id, permission_code)
        SELECT
            (SELECT COALESCE(MAX(id), 0) FROM access_control.public.access_group_permission) + ROW_NUMBER() OVER () AS id,
            max_access_group_id + ROW_NUMBER() OVER () AS access_group_id,
            fgp.permission_code
           
        FROM
            dblink('db_connection',
                   'SELECT folder_group_id, permission_code
                    FROM folder_group_permission') AS fgp(
                                                          folder_group_id BIGINT,
                                                          permission_code VARCHAR(128)
                )
                JOIN access_control.public.access_group ag ON ag.id = fgp.folder_group_id
        ON CONFLICT (id) DO NOTHING;

        PERFORM dblink_disconnect('db_connection');
    END $$;

sql plsql migration plsqldeveloper dblink
1个回答
0
投票

只是您的文件夹表在访问表中必须具有不同的内容,并且需要一些行生成:

Select      LEVEL "ID", FOLDER_NAME "ACCESS_TYPE_ID", LEVEL "ID_ENTITY"
From        folder
Connect By  LEVEL <= FOLDER_NAME
/*    R e s u l t :
        ID ACCESS_TYPE_ID  ID_ENTITY
---------- -------------- ----------
         1              3          1
         2              3          2
         3              3          3    */

如果您有指向目标的数据库链接和适当的授权,只需插入上述结果集中的值即可。应该通过数据库链接将值选择到相应的列中来插入另外两个表。

© www.soinside.com 2019 - 2024. All rights reserved.