我有三个表:folder、folder_group 和 folder_group_permission。
这些是源表,我需要将数据卸载到新表中的新模式,其中表中的逻辑略有不同access、access_group和access_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 $$;
只是您的文件夹表在访问表中必须具有不同的内容,并且需要一些行生成:
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 */
如果您有指向目标的数据库链接和适当的授权,只需插入上述结果集中的值即可。应该通过数据库链接将值选择到相应的列中来插入另外两个表。