DM其他常用命令:
创建普通用户&授权:
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;