达梦(DM)常用命令

DM其他常用命令:

disql 命令行连接数据库(用户 SYSDBA)
[root@localhost ~]# disql SYSDBA/[email protected]:5236

disql 命令行连接数据库(用户 TESTUSER01)
[root@localhost ~]# disql TESTUSER01/[email protected]:5236

创建模式(创建schema)
CREATE SCHEMA MYSCHEMA AUTHORIZATION SYSDBA;
/
注意: 如果是SQL命令行终端执行创建schema语句,无法结束,需要第二行再输入"/"才能结束。

SQL语句切换模式名:
ALTER SESSIONS SET CURRENT_SCHEMA=模式名; 或者 set schema 模式名;

SQL查看用户会话当前的模式名:
SELECT SF_GET_SCHEMA_NAME_BY_ID(CURRENT_SCHID);

JDBC连接时如果要指定其他模式(默认使用用户名相同的模式名、无需指定模式名):
默认无需指定模式名进行JDBC连接达梦:
jdbc:dm://192.168.1.232:5236

指定其他模式名进行JDBC连接达梦:
jdbc:dm://192.168.1.232:5236?schema=myshcema

如果模式名包含特殊字符,则双引号包含模式名:
jdbc:dm://192.168.1.232:5236?schema=""my-Schema""

SQL查询当前用户下的所有表(包含所有模式下的表):
select * from user_tables;

通过 DBA_OBJECTS、ALL_OBJECTS、SYSOBJECTS 视图查看对象:
select * from DBA_OBJECTS where OWNER='SYSDBA';     -- OWNER指定模式名
select * from DBA_OBJECTS where OWNER='TESTUSER01'; -- OWNER指定模式名
select * from ALL_OBJECTS where OWNER='TESTUSER01'; -- OWNER指定模式名
select * from SYSOBJECTS where OWNER='TESTUSER01';  -- OWNER指定模式名
 

创建普通用户&授权:
CREATE USER DAMENG02 IDENTIFIED BY "DAMENG123"  DEFAULT TABLESPACE "USER_TBS" DEFAULT INDEX TABLESPACE "USER_IDX";

一般普通用户只需要要授予 RESOURCE 和 PUBLIC 两个角色即可:
GRANT PUBLIC to DAMENG02;
GRANT RESOURCE to DAMENG02;

查询PUBLIC角色被授予的权限:
SQL> SELECT * FROM dba_sys_privs where grantee='PUBLIC';

LINEID     GRANTEE PRIVILEGE        ADMIN_OPTION
---------- ------- ---------------- ------------
1          PUBLIC  INSERT TABLE     NO
2          PUBLIC  UPDATE TABLE     NO
3          PUBLIC  DELETE TABLE     NO
4          PUBLIC  SELECT TABLE     NO
5          PUBLIC  REFERENCES TABLE NO
6          PUBLIC  GRANT TABLE      NO
7          PUBLIC  INSERT VIEW      NO
8          PUBLIC  UPDATE VIEW      NO
9          PUBLIC  DELETE VIEW      NO
10         PUBLIC  SELECT VIEW      NO
11         PUBLIC  GRANT VIEW       NO

LINEID     GRANTEE PRIVILEGE                ADMIN_OPTION
---------- ------- ------------------------ ------------
12         PUBLIC  EXECUTE PROCEDURE        NO
13         PUBLIC  GRANT PROCEDURE          NO
14         PUBLIC  SELECT SEQUENCE          NO
15         PUBLIC  GRANT SEQUENCE           NO
16         PUBLIC  EXECUTE PACKAGE          NO
17         PUBLIC  GRANT PACKAGE            NO
18         PUBLIC  SELECT ANY DICTIONARY    NO
19         PUBLIC  SELECT MATERIALIZED VIEW NO
20         PUBLIC  GRANT DOMAIN             NO
21         PUBLIC  USAGE DOMAIN             NO
22         PUBLIC  DUMP TABLE               NO

查询用户(DAMENG02)授予的所有权限:
SQL> SELECT * FROM dba_sys_privs where grantee='DAMENG02';

查询角色(PUBLIC)授予的对象权限:
SQL> SELECT * FROM DBA_TAB_PRIVS t where T.GRANTEE = 'PUBLIC';

取消授权(回收权限),需要SYSDBA给其他用户授权/回收权限:
REVOKE PUBLIC FROM DAMENG02;
REVOKE RESOURCE FROM DAMENG02;
注意:如果在授予对象权限时指定 with grant option,则回收时需要增加 cascade 关键字级联回收权限。

GRANT 权限转授选项:
with admin option : user01 被系统管理员授予某些权限,用户 user01 又授予给用户 user02 的某些权限。当系统管理员回收用户 user01 的权限时,用户 user02 的权限将不会受到影响。
with grant option : user01 被系统管理员授予某些权限,用户 user01 又授予给用户 user02 的某些权限。当系统管理员回收用户 user01 的权限时,用户 user02 的权限也会被同步回收。

其他个性化授权:
GRANT CREATE TABLE,SELECT TABLE,UPDATE TABLE,INSERT TABLE to DAMENG02;
GRANT SELECT TABLE to DAMENG02;  --- 只授予查询权限
REVOKE CREATE TABLE,SELECT TABLE,UPDATE TABLE,INSERT TABLE FROM DAMENG02;

创建角色
CREATE ROLE role02;

给角色授权,赋予角色权限(可以是角色权限、可以是系统权限、也可以是对象权限):
GRANT role01 TO role02;
GRANT create table TO role02;
GRANT select on xxx.xxx TO role02;

查看角色权限:
SELECT * FROM dba_sys_privs;

查看表的权限:
SELECT * FROM dba_tab_privs;

查看用户角色权限:
SELECT GRANTEE, GRANTED_ROLE FROM SYS.DBA_ROLE_PRIVS WHERE GRANTEE='DAMENG02';

查看当前用户拥有的权限信息:
SELECT * FROM session_privs;

权限包含系统权限和对象权限。基于某个数据库对象的查询、操作等为对象权限。相关数据字典:

select * from DBA_SYS_PRIVS t where T.GRANTEE = 'DAMENG02';       -- 授予的系统权限
select * from DBA_TAB_PRIVS t where T.GRANTEE = 'DAMENG02';       -- 授予的对象权限
select * from DBA_ROLE_PRIVS t where T.GRANTEE = 'DAMENG02';      -- 授予的角色
select * from DBA_COL_PRIVS t where T.GRANTEE = 'DAMENG02';       -- 授予的列权限

系统权限:常见的系统权限有 CREATE TABLE, ALTER DATABASE, CREATE/DROP/ALTER TABLESPACE, CREATE USER, CREATE VIEW, CREATE PROCEDURE, CREATE ROLE, CREATE SCHEMA 等;
对象权限:是指针对具体用户对象的DML 数据操作权限,包括表或视图及其列的 SELECT、INSERT、DELETE、UPDATE、REFERENCES 和 DUMP 权限,序列的查询权限,函数、包、类、存储过程的EXECUTE权限,以及这些权限的转授权限()。

查询用户状态:
SELECT USERNAME,ACCOUNT_STATUS,LOCK_DATE FROM DBA_USERS;

查看数据库中的所有用户信息(包括 USERNAME, ACCOUNT_STATUS, LOCK_DATE EXPIRY_DATE等):
select * from dba_users;

达梦数据库内置用户如下:
SYSSSO:系统安全员
SYSDBA:系统管理员
SYS:内置用户,不能直接登录
SYSAUDITOR:系统审计员,用于审计相关功能。

查看用户的口令策略参数信息:
select * from v$dm_ini t where t.para_name = ‘PWD_POLICY’;

统计信息 & 查询表的数据量(条数)
dbms_stats.GATHER_TABLE_STATS ('DAMENG02','TEST01');
SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='TEST01';

注意:
1)统计信息收集过程中将对数据库性能造成一定影响,避免业务繁忙时使用;
2)达梦数据库数据表变化以后,需要手动执行 dbms_stats.GATHER_TABLE_STATS 后再查询 USER_TABLES 视图,数据量(NUM_ROWS)才会刷新。这和其他的数据库有区别,其他数据库(Oracle、PostgreSQL、GaussDB等)都会自动刷新;
3)统计信息的查询,不同数据库会有差异:
MySQL:
    SELECT TABLE_NAME, TABLE_ROWS FROM information_schema.tables WHERE TABLE_NAME = 'xxx';  

Oracle:
    SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='xxx';    -- view: SYS.USER_TABLES

PostgreSQL:
    SELECT schemaname,relname,n_live_tup FROM pg_stat_user_tables WHERE schemaname='public' and relname = 'xxx';   -- view: pg_catalog.pg_stat_user_tables

GaussDB:
    SELECT schemaname,relname,n_live_tup FROM pg_stat_user_tables WHERE schemaname='public' and relname = 'xxx';   -- view: pg_catalog.pg_stat_user_tables

DM:
    dbms_stats.GATHER_TABLE_STATS ('DAMENG02','xxx');    -- 搜集统计信息,只针对 schema=DAMENG 下的指定的表xxx。如果 dbms_stats.GATHER_TABLE_STATS ('DAMENG02'); 则搜集统计信息,针对 schema=DAMENG 下的所有的表
    SELECT TABLE_NAME, NUM_ROWS FROM USER_TABLES WHERE TABLE_NAME='xxx';  -- 查询数据量

dbms_stats.GATHER_TABLE_STATS 所需权限:
    a)需要 DBMS_STATS 对象权限,授权语句如下: GRANT EXECUTE ON sys.dbms_stats TO DAMENG02;
    b)需要的对应权限:SYS用户和DBA可以收集、删除所有对象的统计信息,普通用户只能收集、删除自己的表。具备ANALYZE ANY权限可操作除SYS外所有用户的统计信息。

USER_TABLES (当前用户拥有的表)所需的查询权限:
    grant PUBLIC to DAMENG02;  -- 授予PUBLIC角色给用户DAMENG02

    网上有说是只需要授予下面即可:
    grant select any table to DAMENG02;             -- 授予查询任何表
    grant select any dictionary to DAMENG02;        -- 授予查询任何字典
    但我在DM上尝试不行,还是提示无查询USER_TABLES权限,授予PUBLIC角色才能查询,需要的是详细对应的哪写权限?还没有确认清楚
==> 最终确认,达梦需要授权 SYS.USER_TABLES 查询权限:
GRANT SELECT on SYS.USER_TABLES to DAMENG02;

另外,如果是Oracle数据库,测试只需要 grant connect, select table to user; 即可,不需要单独授予 SYS.USER_TABLES 查询权限(也不需要授予角色关联该权限)。
    
相关视图:
    DBA_TABLES : 显示的是数据库中所有表(所有表DBA都可以操作)
    ALL_TABLES : 显示与当前用户可访问的表 (只要对某个表有任何权限,即可在此视图中看到表的相关信息)
    USER_TABLES: 显示当前用户拥有的表

用户锁定和解锁:
alter user DAMENG02 account lock;
alter user DAMENG02 account unlock;
 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>