siteserver / cms

SS CMS 基于 .NET Core,能够以最低的成本、最少的人力投入在最短的时间内架设一个功能齐全、性能优异、规模庞大并易于维护的网站平台。
https://sscms.com
GNU Affero General Public License v3.0
3.65k stars 1.2k forks source link

7.2.1使用达梦数据库安装时,永远跳转到安装界面 #3638

Open fsea opened 1 year ago

fsea commented 1 year ago

安装完以后,还会继续跳回安装界面,并且无法登录后台 经查看,数据库表结构和基础数据都已创建成功, 粗略分析了一下,Datory\Database.cs中的 public async Task IsTableExistsAsync(string tableName)方法, var sql = $"SELECT COUNT() FROM dba_tables WHERE owner = '{databaseName}' AND table_name = '{tableName}'"; 这条查询dba_tables的权限要求比较高,权限不足时导致判断出错从而一直跳回登录,建议修改为USER_TABLES: var sql = $"SELECT COUNT() FROM USER_TABLES WHERE table_name = '{tableName}'";

相同的问题在Datory\DatabaseImpl\DmImpl.cs中的 public async Task<List> GetTableNamesAsync(string connectionString)方法也一样,

fsea commented 1 year ago

DBA_TABLES:DBA拥有的或者可以访问的所有关系表 ALL_TABLES:某一用户所拥有的或者可以访问的所有关系表 USER_TABLES:某一用户所拥有的所有关系表

starlying commented 1 year ago

收到,我们调整一下代码,感谢反馈

fsea commented 10 months ago

这个问题一直没有修复哦

starlying commented 10 months ago

问题已修复,更新到7.2.2版本即可。

lmq219-123 commented 8 months ago

7.2.2有问题,需要把Datory.Databaselmp.Dmlmpl.cs 93 var sql = $"SELECT COUNT() FROM user_tables WHERE owner = '{databaseName}' AND table_name = '{tableName}'"; 改成 var sql = $"SELECT COUNT() FROM user_tables WHERE table_name = '{tableName}'"; user_tables 没有 owner 列

starlying commented 8 months ago

7.2.2有问题,需要把Datory.Databaselmp.Dmlmpl.cs 93 var sql = $"SELECT COUNT(_) FROM user_tables WHERE owner = '{databaseName}' AND tablename = '{tableName}'"; 改成 var sql = $"SELECT COUNT() FROM user_tables WHERE table_name = '{tableName}'"; user_tables 没有 owner 列

看看是不是达梦数据库的版本太低导致的,用DM8试试,我们再DM8上测试是正常的。

lmq219-123 commented 8 months ago

7.2.2有问题,需要把Datory.Databaselmp.Dmlmpl.cs 93 var sql = $"SELECT COUNT(_) FROM user_tables WHERE owner = '{databaseName}' AND tablename = '{tableName}'"; 改成 var sql = $"SELECT COUNT() FROM user_tables WHERE table_name = '{tableName}'"; user_tables 没有 owner 列

看看是不是达梦数据库的版本太低导致的,用DM8试试,我们再DM8上测试是正常的。

测试安装的是DM8,安装包名是dm8_20230928_x86_win_64.zip,查了一下sys.user_tables的视图,没有owner字段

AS  
        SELECT /*+ LOCAL_OBJECT(V$TABLESPACE) LOCAL_OBJECT(V$HUGE_TABLESPACE) COMPLEX_VIEW_MERGING(0) */
        O3.NAME TABLE_NAME,
        CASE WHEN
            O3.INFO3&0X3F IN (0x13, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27)
            THEN
                HTS.NAME
            ELSE
                TS.NAME
        END TABLESPACE_NAME,
        NULL CLUSTER_NAME,
        O3.NAME IOT_NAME,
        DECODE(O3.VALID,'Y','VALID','UNUSABLE') STATUS,
        CAST(NULL AS NUMBER) PCT_FREE,
        CAST(NULL AS NUMBER) PCT_USED,
        CAST(NULL AS NUMBER) INI_TRANS,
        CAST(NULL AS NUMBER) MAX_TRANS,
        CAST(NULL AS NUMBER) INITIAL_EXTENT,
        CAST(NULL AS NUMBER) NEXT_EXTENT, 
        CAST(NULL AS NUMBER) MIN_EXTENTS,
        CAST(NULL AS NUMBER) MAX_EXTENTS,
        CAST(NULL AS NUMBER) PCT_INCREASE,
        CAST(NULL AS NUMBER) FREELISTS,
        CAST(NULL AS NUMBER) FREELIST_GROUPS,
        NULL LOGGING,
        NULL BACKED_UP,
        CAST(SAMP.T_TOTAL AS  NUMBER) NUM_ROWS,
        CAST(SAMP.N_LEAF_PAGES AS NUMBER) BLOCKS,
        CAST(SAMP.N_LEAF_PAGES - SAMP.N_LEAF_USED_PAGES AS NUMBER) EMPTY_BLOCKS,
        CAST(NULL AS NUMBER) AVG_SPACE,
        CAST(NULL AS NUMBER) CHAIN_CNT,
        CAST(NULL AS NUMBER) AVG_ROW_LEN,
        CAST(NULL AS NUMBER) AVG_SPACE_FREELIST_BLOCKS,
        CAST(NULL AS NUMBER) NUM_FREELIST_BLOCKS,
        NULL DEGREE,
        NULL INSTANCES,
        NULL CACHE,
        'ENABLED' TABLE_LOCK,
        CAST(SAMP.T_TOTAL AS NUMBER) SAMPLE_SIZE,
        CAST(SAMP.LAST_GATHERED AS DATE) LAST_ANALYZED,
        CASE WHEN SUB_COUNT IS NOT NULL AND SUB_COUNT > 0 THEN 'YES'
          ELSE 'NO' 
        END PARTITIONED,
        CASE WHEN O3.INFO1 & 0XFFFF0 = 0 THEN 'IOT' ELSE 'NULL' END IOT_TYPE,
        CASE WHEN O3.INFO3_TMP IS NOT NULL AND O3.INFO3_TMP THEN 'Y' ELSE 'N' END TEMPORARY,
        NULL SECONDARY,
        NULL NESTED,
        NULL BUFFER_POOL,
        CAST(NULL AS VARCHAR(7)) FLASH_CACHE,
        CAST(NULL AS VARCHAR(7)) CELL_FLASH_CACHE,
        CASE WHEN O3.INFO3 & 0X400000 = 0 THEN 'DISABLED' ELSE 'ENABLED' END ROW_MOVEMENT,
        'YES' GLOBAL_STATS,
        'NO' USER_STATS,
        CASE WHEN 
              O3.INFO3_TMP IS NOT NULL AND O3.INFO3_TMP
            THEN 
              CASE WHEN O3.INFO3&0X10000 != 0 THEN 'SYS$SESSION' ELSE 'SYS$TRANSACTION' END
            ELSE 
                NULL 
        END DURATION,
        NULL SKIP_CORRUPT,
        NULL MONITORING,
        NULL CLUSTER_OWNER,
        NULL DEPENDENCIES,
        CASE WHEN T_TABCOL.PACK_COUNT IS NOT NULL
           THEN CASE WHEN T_TABCOL.PACK_COUNT > 0 THEN 'ENABLED' ELSE 'DISABLED' END
        ELSE NULL END COMPRESSION,
        NULL COMPRESS_FOR,
        NULL DROPPED,
        NULL READ_ONLY,
        CAST(NULL AS VARCHAR(3)) SEGMENT_CREATED,
        CAST(NULL AS VARCHAR(7)) RESULT_CACHE,
          CASE WHEN O3.INFO3 & 0x04000000000000 = 0 THEN 'DISABLED' ELSE 'ENABLED' END LONG_ROW
     FROM 
                        (SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH') O2
                        JOIN (SELECT ID, NAME, PID, SCHID, INFO1, INFO3, INFO3 & 0XC0 INFO3_TMP, VALID, SUB_COUNT FROM 
                            (WITH  T_TAB AS (SELECT * FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ IN ('UTAB', 'STAB') AND NAME NOT LIKE '_%$AUX' AND NAME NOT LIKE '_%$RAUX' AND NAME NOT LIKE '_%$DAUX' AND NAME NOT LIKE '_%$UAUX' AND NAME NOT LIKE '_%$ALOG' 
                            AND INFO3 & 0x100000000 = 0)
                       SELECT * FROM  (SELECT * FROM T_TAB WHERE PID = -1) P_TAB LEFT JOIN
                       (SELECT PID SUB_PID, COUNT(PID) SUB_COUNT FROM T_TAB WHERE PID IS NOT NULL AND PID > 0 GROUP BY PID) SUBTAB ON SUBTAB.SUB_PID =  P_TAB.ID)
                        ) O3 ON O3.SCHID = O2.ID
                        JOIN (SELECT ID, PID FROM SYS.SYSOBJECTS WHERE SUBTYPE$='INDEX') T_INDEX ON T_INDEX.PID = O3.ID
                        JOIN (SELECT ID, GROUPID FROM SYS.SYSINDEXES WHERE XTYPE&0X01=0) T_IND ON T_INDEX.ID = T_IND.ID
                        LEFT JOIN (SELECT DISTINCT NAME, ID FROM SYS.V$TABLESPACE) TS ON T_IND.GROUPID = TS.ID
                        LEFT JOIN (SELECT DISTINCT NAME, ID FROM SYS.V$HUGE_TABLESPACE) HTS ON T_IND.GROUPID = HTS.ID
                        LEFT JOIN (SELECT ID, SUM(INFO1&0X01) PACK_COUNT FROM SYS.SYSCOLUMNS GROUP BY ID) T_TABCOL ON (T_TABCOL.ID = O3.ID)
                        LEFT JOIN (SELECT ID, T_TOTAL, N_SAMPLE, LAST_GATHERED, N_LEAF_PAGES, N_LEAF_USED_PAGES FROM SYS.SYSSTATS WHERE COLID=-1) SAMP ON O3.ID = SAMP.ID
            WHERE
                  O2.PID = UID()
UNION ALL --外部表
        SELECT /*+ COMPLEX_VIEW_MERGING(0) */
        O3.NAME TABLE_NAME,
        NULL TABLESPACE_NAME,           --外部表没有表空间
        NULL CLUSTER_NAME,
        NULL IOT_NAME,                  --外部表没有索引,参照IOT_TYPE恒为NULL
        DECODE(O3.VALID,'Y','VALID','UNUSABLE') STATUS,
        CAST(NULL AS NUMBER) PCT_FREE,
        CAST(NULL AS NUMBER) PCT_USED,
        CAST(NULL AS NUMBER) INI_TRANS,
        CAST(NULL AS NUMBER) MAX_TRANS,
        CAST(NULL AS NUMBER) INITIAL_EXTENT,
        CAST(NULL AS NUMBER) NEXT_EXTENT, 
        CAST(NULL AS NUMBER) MIN_EXTENTS,
        CAST(NULL AS NUMBER) MAX_EXTENTS,
        CAST(NULL AS NUMBER) PCT_INCREASE,
        CAST(NULL AS NUMBER) FREELISTS,
        CAST(NULL AS NUMBER) FREELIST_GROUPS,
        NULL LOGGING,
        NULL BACKED_UP,
        CAST(NULL AS  NUMBER) NUM_ROWS,  --外部表不支持统计
        CAST(NULL AS NUMBER) BLOCKS,
        CAST(NULL AS NUMBER) EMPTY_BLOCKS,
        CAST(NULL AS NUMBER) AVG_SPACE,
        CAST(NULL AS NUMBER) CHAIN_CNT,
        CAST(NULL AS NUMBER) AVG_ROW_LEN,
        CAST(NULL AS NUMBER) AVG_SPACE_FREELIST_BLOCKS,
        CAST(NULL AS NUMBER) NUM_FREELIST_BLOCKS,
        NULL DEGREE,
        NULL INSTANCES,
        NULL CACHE,
        'ENABLED' TABLE_LOCK,
        CAST(NULL AS NUMBER) SAMPLE_SIZE,  --外部表不支持统计
        CAST(NULL AS DATE) LAST_ANALYZED,
        'NO' PARTITIONED,                  --外部表不支持分区
        NULL IOT_TYPE,                     --外部表没有索引
        'N' TEMPORARY,                     --外部表不能为临时表
        NULL SECONDARY,
        NULL NESTED,
        NULL BUFFER_POOL,
        CAST(NULL AS VARCHAR(7)) FLASH_CACHE,
        CAST(NULL AS VARCHAR(7)) CELL_FLASH_CACHE,
        'DISABLED' ROW_MOVEMENT,
        'YES' GLOBAL_STATS,
        'NO' USER_STATS,
        NULL DURATION,                     --外部表不能为临时表
        NULL SKIP_CORRUPT,
        NULL MONITORING,
        NULL CLUSTER_OWNER,
        NULL DEPENDENCIES,
        'DISABLED' COMPRESSION,             --外部表不支持压缩
        'BASIC' COMPRESS_FOR,               --外部表不支持压缩
        NULL DROPPED,
        NULL READ_ONLY,
        CAST(NULL AS VARCHAR(3)) SEGMENT_CREATED,
        CAST(NULL AS VARCHAR(7)) RESULT_CACHE,
        'DISABLED' LONG_ROW                 --外部表不支持LONG ROW
     FROM 
        (SELECT ID, NAME, PID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCH') O2
        JOIN (SELECT ID, NAME, SCHID, VALID FROM SYS.SYSOBJECTS WHERE TYPE$ = 'SCHOBJ' AND SUBTYPE$ = 'UTAB' AND INFO3&0X3F = 0x0D) O3 ON O3.SCHID = O2.ID
     WHERE
        O2.PID = UID();
starlying commented 8 months ago

收到,我们会尽快修复。

starlying commented 8 months ago

已修复,到官网下载最新版本更新再试试。