达梦disql执行动态脚本卸数
一行命令完成查询并保存
disql SYSDBA/SYSDBA@localhost:5236 << EOF > a.txt
set heading off feedback off pagesize 0 linesize 1000 trimspool on
SELECT * FROM dual;
exit
EOF
达梦密码带特殊字符
disql SYSDBA/\"Sys@123456!\"@localhost:5236
带参数的脚本
#!/bin/bash
# 参数处理
if [ $# -lt 3 ]; then
echo "用法: $0 <用户名> <密码> <SQL查询>"
echo "示例: $0 SYSDBA SYSDBA 'SELECT * FROM dual'"
exit 1
fi
USER=$1
PASSWORD=$2
QUERY=$3
OUTPUT_FILE="a.txt"
# 执行查询
disql ${USER}/${PASSWORD}@localhost:5236 << EOF
set heading off feedback off pagesize 0 linesize 1000
spool ${OUTPUT_FILE}
${QUERY}
spool off
exit
EOF
# 检查是否成功
if [ $? -eq 0 ]; then
echo "查询执行成功,结果保存在 ${OUTPUT_FILE}"
echo "文件内容:"
cat ${OUTPUT_FILE}
else
echo "查询执行失败"
exit 1
fi
使用配置文件方式
#!/bin/bash
# 读取配置文件
source db_config.conf
# 执行多个查询并保存到不同文件
disql ${DB_USER}/${DB_PASSWORD}@${DB_HOST}:${DB_PORT} << EOF
set echo off heading off feedback off pagesize 0 linesize 1000
-- 保存表数量统计到 a.txt
spool a.txt
SELECT '总表数: ' || COUNT(*) FROM user_tables;
spool off
-- 保存表清单到 b.txt
spool b.txt
SELECT table_name FROM user_tables ORDER BY table_name;
spool off
exit
EOF
高级用法:格式化输出
#!/bin/bash
disql SYSDBA/SYSDBA@localhost:5236 << EOF
set colsep '|' -- 列分隔符
set trimspool on
set linesize 1000
set pagesize 20
-- 保存格式化的查询结果
spool a.txt
COLUMN user_id FORMAT 99999
COLUMN user_name FORMAT A20
COLUMN create_time FORMAT A20
SELECT
user_id,
user_name,
TO_CHAR(create_time, 'YYYY-MM-DD HH24:MI:SS') as create_time
FROM
users
WHERE
rownum <= 10;
spool off
exit
EOF
达梦数据库常用语句示例
终端登录
# 直接登录数据库
disql username/password[@ip][:port]
#如
disql SYSDBA/SYSDBA
#进入交互式终端后登录
/disql /nolog
conn 用户名/密码@IP:端口
#或
connect 用户名/密码@IP:端口
# 查看数据库信息
desc v$database;
客户端
客户端执行脚本文件,打开查询如下格式执行
`D:\init.sql
schema/database
database
#查看版本
select * from v$version;--DM7
select id_code();--DM8
#查看时间
select now();
#查询授权信息
select * from v$license;
#查询服务器信息
select * from V$SYSTEMINFO;
#切换schema
ALTER SESSION SET CURRENT_SCHEMA=模式名;
或
SET SCHEMA 模式名;
#查询所有表
SELECT TABLE_NAME FROM USER_TABLES;
SELECT TABLE_NAME FROM ALL_TABLES;
SELECT TABLE_NAME FROM DBA_TABLES;
#查看数据库服务器配置参数
select * from v$dm_ini;
#查看数据库的配置端口
select para_name,para_value from v$dm_ini where para_name like '%PORT%';
#查看达梦数据库库名
select name,create_time from v$database;
#查看达梦数据库实例名及状态
select name,instance_name,start_time,status$ from v$instance;
#查看字符集
--达梦 字符集(0 表示 GB18030,1 表示 UTF-8,2 表示 EUC-KR)
select UNICODE ();或 select SF_GET_UNICODE_FLAG();
#查看大小写敏感
--大小敏感(1为大小写敏感,0为大小写不敏感)
SELECT SF_GET_CASE_SENSITIVE_FLAG();
或
SELECT CASE_SENSITIVE()
#VARCHAR类型长度是否以字符为单位
--VARCHAR类型长度是否以字符为单位,(0否,1是)
Select SF_GET_LENGTH_IN_CHAR();
#数据页大小
SELECT SF_GET_PAGE_SIZE(); /* 32768/1024=32KB */
#或
SELECT CAST(PAGE()/1024 AS VARCHAR);
#查询簇大小
SELECT SF_GET_EXTENT_SIZE();
SCHEMA
#创建schema(注意输入/作为结束标记)
create schema MY_SCHEMA;
/
-- 查询模式下所有表
SELECT table_name FROM all_tables WHERE owner = 'MY_SCHEMA';
-- 查询模式下所有视图
SELECT view_name FROM all_views WHERE owner = 'MY_SCHEMA';
-- 查询模式下所有存储过程
SELECT object_name FROM all_procedures WHERE owner = 'MY_SCHEMA';
#删除schema
DROP SCHEMA MY_SCHEMA CASCADE;
表空间
# 创建表空间
CREATE TABLESPACE DMTEST DATAFILE 'DMTEST_DATA01.dbf' SIZE 10240;
# 创建索引表空间
CREATE TABLESPACE DMTEST_IDX DATAFILE 'DMTEST_IDX01.dbf' SIZE 2048;
CREATE USER "DMTEST" IDENTIFIED BY "DMTEST@123" DEFAULT TABLESPACE "DMTEST" DEFAULT INDEX TABLESPACE "DMTEST_IDX";
表相关操作
#创建表
CREATE TABLE t_1( id varchar(20) );
#查询表
SELECT * FROM t_1;
#数据插入
INSERT INTO T_1 VALUES('AAA');
insert into "DMTEST"."TEST"("ID", "NAME") VALUES('10001', '张三0001');
#删除数据
#删除记录
select * from "DMTEST"."TEST" where id = 1
#清空表
DROP TABLE t_1;
TRUNCATE TABLE "DMTEST"."TEST"
存储过程
基本结构
CREATE [OR REPLACE] PROCEDURE <过程名>
[
<参数名> <参数模式> <数据类型> [DEFAULT <默认值>],
...
]
AS | IS
[<声明部分:变量、常量、游标等>]
BEGIN
<执行部分:SQL语句、流程控制等>
[EXCEPTION
<异常处理部分>]
END [<过程名>];
/
其中:
参数模式:IN(输入,默认),OUT(输出),IN OUT(输入输出)。
执行:EXECUTE <过程名>(<参数值>);或CALL <过程名>(<参数值>);
修改:使用CREATE OR REPLACE PROCEDURE重新定义。
删除:DROP PROCEDURE proc_name;
查看:查询USER_SOURCE视图查看源代码:
简单示例
创建一个存储过程,用于给指定员工涨薪。
CREATE OR REPLACE PROCEDURE raise_salary (
in_emp_id IN NUMBER,
in_raise_pct IN NUMBER DEFAULT 0.05
)
AS
v_current_salary NUMBER;
BEGIN
-- 查询当前薪水
SELECT salary INTO v_current_salary FROM employees WHERE employee_id = in_emp_id;
-- 更新薪水
UPDATE employees
SET salary = salary * (1 + in_raise_pct)
WHERE employee_id = in_emp_id;
-- 提交事务(注意:也可以在调用端提交)
COMMIT;
DBMS_OUTPUT.PUT_LINE('Employee ' || in_emp_id || ' salary raised from ' || v_current_salary || ' to ' || (v_current_salary * (1 + in_raise_pct)));
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Employee ID ' || in_emp_id || ' not found.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('An error occurred: ' || SQLERRM);
ROLLBACK;
END raise_salary;
/
dmfldr卸数示例
dmfldr userid=DMTEST/DMTEST1234@192.168.0.35:30236 LOB_AS_VARCHAR=TRUE control=\'/user/data/nfs/app/netty/work/dataex/DM_ARGODB_TEST/20241028/TEST.txt.export.sql\' mode=\'out\' character_code=\'utf-8\'
ctl文件示例
LOAD DATA
INFILE '/user/data/nfs/app/netty/work/dataex/DM_ARGODB_TEST/20241028/TEST.txt'
INTO TABLE DMTEST.TEST
FIELDS ','
(
ID
,NAME
)
常用系统函数
时间类
| 函数 | 时区 | 包含时间 | 建议场景 |
|---|---|---|---|
| SYSDATE | 数据库服务器时区 | 是 | 需要数据库服务器时间 |
| CURRENT_DATE | 会话时区 | 是 | 需要客户端本地时间 |
| SYSTIMESTAMP | 数据库服务器时区 | 是,带小数秒 | 需要精确时间戳 |
-- 使用SYSDATE获取数据库服务器时间
SELECT TO_CHAR(SYSDATE, 'yyyyMMdd') FROM dual;
-- 使用CURRENT_DATE获取会话时区时间
SELECT TO_CHAR(CURRENT_DATE, 'yyyyMMdd') FROM dual;
-- 使用SYSTIMESTAMP获取带时区的服务器时间
SELECT TO_CHAR(SYSTIMESTAMP, 'yyyyMMdd') FROM dual;
-- 获取前一天的日期
SELECT TO_CHAR(SYSDATE - 1, 'yyyyMMdd') as yesterday FROM dual;
-- 获取明天日期
SELECT TO_CHAR(SYSDATE + 1, 'yyyyMMdd') as tomorrow FROM dual;
-- 获取月初第一天
SELECT TO_CHAR(TRUNC(SYSDATE, 'MM'), 'yyyyMMdd') as month_first FROM dual;
-- 获取月末最后一天
SELECT TO_CHAR(LAST_DAY(SYSDATE), 'yyyyMMdd') as month_last FROM dual;
-- 获取上个月同一天
SELECT TO_CHAR(ADD_MONTHS(SYSDATE, -1), 'yyyyMMdd') as last_month_same_day FROM dual;
-- 分隔符会原样显示
SELECT TO_CHAR(SYSDATE, 'yyyy-mm-dd') FROM dual; -- 输出:2023-02-15
SELECT TO_CHAR(SYSDATE, 'yyyy/mm/dd') FROM dual; -- 输出:2023/02/15
-- 获取带时间的格式
SELECT TO_CHAR(SYSDATE, 'yyyymmdd hh24miss') FROM dual; -- 24小时制:20230215 143025
SELECT TO_CHAR(SYSDATE, 'yyyymmdd hhmiss') FROM dual; -- 12小时制:20230215 023025PM
子查询
基础子查询
-- 查询每个部门的最高薪员工
SELECT * FROM employees e1
WHERE e1.salary = (
SELECT MAX(e2.salary)
FROM employees e2
WHERE e2.department_id = e1.department_id
);
####多行子查询(IN)
-- 查询经理管理的员工
SELECT * FROM employees
WHERE manager_id IN (
SELECT employee_id FROM employees WHERE job_title = 'Manager'
);
使用内联视图(Inline View)
-- 查询每个部门的平均工资及部门信息
SELECT d.department_name, e.dept_avg_salary
FROM departments d
JOIN (
SELECT
department_id,
ROUND(AVG(salary), 2) as dept_avg_salary,
COUNT(*) as emp_count
FROM employees
GROUP BY department_id
) e ON d.department_id = e.department_id
WHERE e.emp_count > 5
ORDER BY e.dept_avg_salary DESC;
使用WITH子句(CTE - 公用表表达式)
-- 查询每个部门工资排名前三的员工
WITH dept_emp_rank AS (
SELECT
employee_id,
first_name,
last_name,
department_id,
salary,
ROW_NUMBER() OVER (
PARTITION BY department_id
ORDER BY salary DESC
) as salary_rank
FROM employees
)
SELECT * FROM dept_emp_rank
WHERE salary_rank <= 3
ORDER BY department_id, salary_rank;
复杂多层嵌套示例
-- 查询各部门平均工资,然后找出高于公司平均工资的部门
SELECT
dept_avg.department_id,
d.department_name,
dept_avg.avg_salary
FROM (
-- 第二层:计算公司平均工资
SELECT
department_id,
ROUND(AVG(salary), 2) as avg_salary,
(SELECT ROUND(AVG(salary), 2) FROM employees) as company_avg
FROM employees
GROUP BY department_id
HAVING AVG(salary) > (SELECT AVG(salary) FROM employees)
) dept_avg
JOIN departments d ON dept_avg.department_id = d.department_id
ORDER BY dept_avg.avg_salary DESC;
多表关联+多层查询
-- 查询每个地区销售额前三的产品
WITH region_sales AS (
SELECT
r.region_name,
p.product_name,
SUM(s.sale_amount) as total_sales,
ROW_NUMBER() OVER (
PARTITION BY r.region_id
ORDER BY SUM(s.sale_amount) DESC
) as sales_rank
FROM sales s
JOIN products p ON s.product_id = p.product_id
JOIN customers c ON s.customer_id = c.customer_id
JOIN regions r ON c.region_id = r.region_id
WHERE s.sale_date >= ADD_MONTHS(SYSDATE, -12) -- 最近一年
GROUP BY r.region_id, r.region_name, p.product_id, p.product_name
)
SELECT
region_name,
product_name,
total_sales,
sales_rank
FROM region_sales
WHERE sales_rank <= 3
ORDER BY region_name, sales_rank;
递归查询示例
-- 查询员工的管理层级(从CEO到普通员工)
WITH emp_hierarchy AS (
-- 初始查询:找到CEO(没有经理的员工)
SELECT
employee_id,
first_name,
last_name,
manager_id,
1 as level,
CAST(first_name || ' ' || last_name AS VARCHAR2(200)) as path
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- 递归查询:逐级向下查找
SELECT
e.employee_id,
e.first_name,
e.last_name,
e.manager_id,
eh.level + 1,
eh.path || ' -> ' || e.first_name || ' ' || e.last_name
FROM employees e
JOIN emp_hierarchy eh ON e.manager_id = eh.employee_id
)
SELECT * FROM emp_hierarchy
ORDER BY level, employee_id;
LATERAL内联视图(Oracle 12c+)
-- 查询每个部门及其最高薪的3名员工
SELECT
d.department_name,
e.employee_name,
e.salary
FROM departments d
CROSS JOIN LATERAL (
SELECT
first_name || ' ' || last_name as employee_name,
salary
FROM employees e
WHERE e.department_id = d.department_id
ORDER BY salary DESC
FETCH FIRST 3 ROWS ONLY
) e
ORDER BY d.department_name, e.salary DESC;
使用临时表的场景
-- 步骤1:创建临时表(会话级)
CREATE GLOBAL TEMPORARY TABLE temp_dept_stats
ON COMMIT PRESERVE ROWS AS
SELECT
department_id,
COUNT(*) as emp_count,
AVG(salary) as avg_salary,
SUM(salary) as total_salary
FROM employees
GROUP BY department_id;
-- 步骤2:使用临时表进行复杂查询
SELECT
d.department_name,
t.emp_count,
ROUND(t.avg_salary, 2) as avg_salary,
t.total_salary,
CASE
WHEN t.avg_salary > (SELECT AVG(avg_salary) FROM temp_dept_stats)
THEN '高于平均'
ELSE '低于平均'
END as salary_status
FROM temp_dept_stats t
JOIN departments d ON t.department_id = d.department_id
ORDER BY t.avg_salary DESC;
-- 步骤3:清理临时表(会话结束时自动清除)
-- TRUNCATE TABLE temp_dept_stats; -- 如需手动清理
结合分析函数的复杂查询
-- 查询每月销售额及环比增长率
WITH monthly_sales AS (
SELECT
TO_CHAR(sale_date, 'YYYY-MM') as sale_month,
SUM(sale_amount) as total_sales,
LAG(SUM(sale_amount)) OVER (ORDER BY TO_CHAR(sale_date, 'YYYY-MM')) as prev_month_sales
FROM sales
WHERE sale_date >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -12)
GROUP BY TO_CHAR(sale_date, 'YYYY-MM')
)
SELECT
sale_month,
total_sales,
prev_month_sales,
ROUND(
(total_sales - prev_month_sales) /
NULLIF(prev_month_sales, 0) * 100,
2
) as growth_rate_percent
FROM monthly_sales
ORDER BY sale_month;
PIVOT转换+多层查询
-- 将行转列:查询每个部门每季度的销售总额
WITH quarterly_sales AS (
SELECT
department_id,
TO_CHAR(sale_date, 'Q') as quarter,
SUM(sale_amount) as sales_total
FROM sales s
JOIN employees e ON s.salesperson_id = e.employee_id
WHERE EXTRACT(YEAR FROM sale_date) = EXTRACT(YEAR FROM SYSDATE)
GROUP BY department_id, TO_CHAR(sale_date, 'Q')
)
SELECT * FROM (
SELECT department_id, quarter, sales_total
FROM quarterly_sales
)
PIVOT (
SUM(sales_total)
FOR quarter IN ('1' as Q1, '2' as Q2, '3' as Q3, '4' as Q4)
)
ORDER BY department_id;
使用WITH子句提高可读性:
WITH
emp_data AS (
SELECT
employee_id,
first_name,
last_name,
department_id,
salary,
hire_date
FROM employees
WHERE status = 'ACTIVE'
),
dept_data AS (
SELECT
department_id,
department_name,
manager_id
FROM departments
WHERE location_id = 1700
),
emp_dept_join AS (
SELECT
e.employee_id,
e.first_name || ' ' || e.last_name as full_name,
e.salary,
d.department_name,
e.hire_date,
ROUND(MONTHS_BETWEEN(SYSDATE, e.hire_date) / 12, 1) as years_of_service
FROM emp_data e
JOIN dept_data d ON e.department_id = d.department_id
)
SELECT
department_name,
COUNT(*) as employee_count,
ROUND(AVG(salary), 2) as avg_salary,
ROUND(AVG(years_of_service), 1) as avg_service_years
FROM emp_dept_join
GROUP BY department_name
HAVING COUNT(*) >= 3
ORDER BY avg_salary DESC;
使用EXISTS代替IN(特别是对于大表):
-- 不好的写法
SELECT * FROM orders
WHERE customer_id IN (
SELECT customer_id FROM customers WHERE status = 'VIP'
);
-- 更好的写法
SELECT * FROM orders o
WHERE EXISTS (
SELECT 1 FROM customers c
WHERE c.customer_id = o.customer_id
AND c.status = 'VIP'
);
避免在WHERE子句中对派生表列使用函数
-- 不好的写法
SELECT * FROM (
SELECT UPPER(product_name) as upper_name, price
FROM products
) WHERE upper_name LIKE '%COMPUTER%';
-- 更好的写法
SELECT * FROM (
SELECT product_name, price
FROM products
WHERE UPPER(product_name) LIKE '%COMPUTER%'
);
实际业务场景示例
-- 电商场景:查询每个客户最近3次订单及平均订单金额
WITH customer_orders AS (
SELECT
customer_id,
order_id,
order_date,
order_amount,
ROW_NUMBER() OVER (
PARTITION BY customer_id
ORDER BY order_date DESC
) as order_seq
FROM orders
WHERE order_status = 'COMPLETED'
),
customer_stats AS (
SELECT
customer_id,
COUNT(*) as total_orders,
ROUND(AVG(order_amount), 2) as avg_order_amount,
SUM(order_amount) as total_spent
FROM orders
WHERE order_status = 'COMPLETED'
GROUP BY customer_id
HAVING COUNT(*) >= 3
)
SELECT
c.customer_name,
c.email,
cs.total_orders,
cs.avg_order_amount,
cs.total_spent,
co1.order_date as last_order_date,
co1.order_amount as last_order_amount,
co2.order_date as second_last_order_date,
co2.order_amount as second_last_order_amount
FROM customers c
JOIN customer_stats cs ON c.customer_id = cs.customer_id
LEFT JOIN customer_orders co1 ON c.customer_id = co1.customer_id AND co1.order_seq = 1
LEFT JOIN customer_orders co2 ON c.customer_id = co2.customer_id AND co2.order_seq = 2
WHERE cs.total_spent > 1000
ORDER BY cs.total_spent DESC;
授权
达梦采用的是角色授权,然后用户分配角色的机制
# 创建角色
CREATE ROLE myschema_role1;
# 角色授权
grant create table to myschema_role1;
grant INSERT ANY TABLE to myschema_role1;
# 角色授权给用户
GRANT myschema_role1 TO DMTEST;
# 直接给用户授权
grant create table to DMTEST;
# 没有[SYSOBJECTS]对象的查询权限
GRANT soi TO 用户名;
# 没有[DBA_OBJECTS]对象的查询权限
GRANT SELECT ON DBA_OBJECTS TO 用户名;
# 权限回收
revoke dba FROM SCHEDULE;
# 查看权限
SELECT * FROM session_roles;
SELECT * FROM DBA_SYS_PRIVS WHERE PRIVILEGE LIKE '%TABLE%';
参考手册: https://eco.dameng.com/document/dm/zh-cn/pm/definition-statement.html
权限类型
| 权限值1 | 权限值2 | 权限值3 | 权限值4 |
|---|---|---|---|
| CREATE SESSION | ADMIN ANY DATABASE PRIVILEGE | UPDATE ANY VIEW | ALTER ANY CONTEXT INDEX |
| CREATE TABLE | GRANT ANY OBJECT PRIVILEGE | DELETE VIEW | DROP ANY CONTEXT INDEX |
| ALTER DATABASE | CREATE ANY SCHEMA | DELETE ANY VIEW | CREATE ANY PACKAGE |
| RESTORE DATABASE | DROP ANY SCHEMA | SELECT VIEW | DROP ANY PACKAGE |
| CREATE USER | CREATE ANY TABLE | SELECT ANY VIEW | EXECUTE PACKAGE |
| ALTER USER | ALTER ANY TABLE | GRANT VIEW | EXECUTE ANY PACKAGE |
| DROP USER | DROP ANY TABLE | GRANT ANY VIEW | GRANT PACKAGE |
| CREATE ROLE | INSERT TABLE | CREATE ANY PROCEDURE | GRANT ANY PACKAGE |
| CREATE SCHEMA | INSERT ANY TABLE | DROP ANY PROCEDURE | CREATE ANY LINK |
| CREATE VIEW | UPDATE TABLE | EXECUTE PROCEDURE | DROP ANY LINK |
| CREATE PROCEDURE | UPDATE ANY TABLE | EXECUTE ANY PROCEDURE | CREATE ANY SYNONYM |
| CREATE SEQUENCE | DELETE TABLE | GRANT PROCEDURE | DROP ANY SYNONYM |
| CREATE TRIGGER | DELETE ANY TABLE | GRANT ANY PROCEDURE | DROP PUBLIC SYNONYM |
| CREATE INDEX | SELECT TABLE | CREATE ANY SEQUENCE | SELECT ANY DICTIONARY |
| CREATE CONTEXT INDEX | SELECT ANY TABLE | DROP ANY SEQUENCE | ADMIN REPLAY |
| BACKUP DATABASE | REFERENCES TABLE | SELECT SEQUENCE | ADMIN BUFFER |
| CREATE LINK | REFERENCES ANY TABLE | SELECT ANY SEQUENCE | CREATE TABLESPACE |
| CREATE REPLICATE | GRANT TABLE | GRANT SEQUENCE | ALTER TABLESPACE |
| CREATE PACKAGE | GRANT ANY TABLE | GRANT ANY SEQUENCE | DROP TABLESPACE |
| CREATE SYNONYM | CREATE ANY VIEW | CREATE ANY TRIGGER | ALTER ANY TRIGGER |
| CREATE PUBLIC SYNONYM | ALTER ANY VIEW | DROP ANY TRIGGER | CREATE MATERIALIZED VIEW |
| ALTER REPLICATE | DROP ANY VIEW | CREATE ANY INDEX | CREATE ANY MATERIALIZED VIEW |
| DROP REPLICATE | INSERT VIEW | ALTER ANY INDEX | DROP ANY MATERIALIZED VIEW |
| DROP ROLE | INSERT ANY VIEW | DROP ANY INDEX | ALTER ANY MATERIALIZED VIEW |
| ADMIN ANY ROLE | UPDATE VIEW | CREATE ANY CONTEXT INDEX | SELECT MATERIALIZED VIEW |
授权权限参考
| 被授权角色 | 权限值 | 系统授权(admin option) | 被授权角色 | 权限值 | 系统授权(admin option) |
|---|---|---|---|---|---|
| SYS | CREATE SESSION | YES | DBA | ALTER ANY MATERIALIZED VIEW | NO |
| SYSDBA | CREATE SESSION | YES | DBA | SELECT MATERIALIZED VIEW | NO |
| SYSAUDITOR | CREATE SESSION | YES | DBA | SELECT ANY MATERIALIZED VIEW | NO |
| SYSSSO | CREATE SESSION | YES | DBA | CREATE ANY DOMAIN | NO |
| SYSREP | CREATE SESSION | NO | DBA | DROP ANY DOMAIN | NO |
| DMTEST | CREATE TABLE | NO | DBA | CREATE DOMAIN | YES |
| DMTEST | CREATE SESSION | NO | DBA | GRANT ANY DOMAIN | NO |
| DBA | ALTER DATABASE | YES | DBA | GRANT DOMAIN | NO |
| DBA | RESTORE DATABASE | YES | DBA | USAGE ANY DOMAIN | NO |
| DBA | CREATE USER | NO | DBA | USAGE DOMAIN | NO |
| DBA | ALTER USER | NO | DBA | CREATE ANY CONTEXT | YES |
| DBA | DROP USER | NO | DBA | DROP ANY CONTEXT | YES |
| DBA | CREATE ROLE | YES | DBA | GRANT ANY CONTEXT | YES |
| DBA | CREATE SCHEMA | YES | DBA | COMMENT ANY TABLE | YES |
| DBA | CREATE TABLE | YES | DBA | DUMP ANY TABLE | YES |
| DBA | CREATE VIEW | YES | DBA | DUMP TABLE | NO |
| DBA | CREATE PROCEDURE | YES | DBA | ADMIN JOB | NO |
| DBA | CREATE SEQUENCE | YES | DBA | CREATE ANY DIRECTORY | YES |
| DBA | CREATE TRIGGER | YES | DBA | DROP ANY DIRECTORY | YES |
| DBA | CREATE INDEX | YES | DBA | ALTER ANY SEQUENCE | YES |
| DBA | CREATE CONTEXT INDEX | YES | DBA | CREATE PROFILE | NO |
| DBA | BACKUP DATABASE | YES | DBA | ALTER PROFILE | NO |
| DBA | CREATE LINK | YES | DBA | DROP PROFILE | NO |
| DBA | CREATE REPLICATE | NO | RESOURCE | CREATE SCHEMA | NO |
| DBA | CREATE PACKAGE | YES | RESOURCE | CREATE TABLE | NO |
| DBA | CREATE SYNONYM | YES | RESOURCE | CREATE VIEW | NO |
| DBA | CREATE PUBLIC SYNONYM | YES | RESOURCE | CREATE PROCEDURE | NO |
| DBA | ALTER REPLICATE | NO | RESOURCE | CREATE SEQUENCE | NO |
| DBA | DROP REPLICATE | NO | RESOURCE | CREATE TRIGGER | NO |
| DBA | DROP ROLE | YES | RESOURCE | CREATE INDEX | NO |
| DBA | ADMIN ANY ROLE | NO | RESOURCE | CREATE CONTEXT INDEX | NO |
| DBA | ADMIN ANY DATABASE PRIVILEGE | NO | RESOURCE | CREATE LINK | NO |
| DBA | GRANT ANY OBJECT PRIVILEGE | NO | RESOURCE | CREATE PACKAGE | NO |
| DBA | CREATE ANY SCHEMA | NO | RESOURCE | CREATE SYNONYM | NO |
| DBA | DROP ANY SCHEMA | NO | RESOURCE | CREATE PUBLIC SYNONYM | NO |
| DBA | CREATE ANY TABLE | NO | RESOURCE | INSERT TABLE | NO |
| DBA | ALTER ANY TABLE | NO | RESOURCE | UPDATE TABLE | NO |
| DBA | DROP ANY TABLE | NO | RESOURCE | DELETE TABLE | NO |
| DBA | INSERT TABLE | NO | RESOURCE | SELECT TABLE | NO |
| DBA | INSERT ANY TABLE | NO | RESOURCE | REFERENCES TABLE | NO |
| DBA | UPDATE TABLE | NO | RESOURCE | GRANT TABLE | NO |
| DBA | UPDATE ANY TABLE | NO | RESOURCE | INSERT VIEW | NO |
| DBA | DELETE TABLE | NO | RESOURCE | UPDATE VIEW | NO |
| DBA | DELETE ANY TABLE | NO | RESOURCE | DELETE VIEW | NO |
| DBA | SELECT TABLE | NO | RESOURCE | SELECT VIEW | NO |
| DBA | SELECT ANY TABLE | NO | RESOURCE | GRANT VIEW | NO |
| DBA | REFERENCES TABLE | NO | RESOURCE | EXECUTE PROCEDURE | NO |
| DBA | REFERENCES ANY TABLE | NO | RESOURCE | GRANT PROCEDURE | NO |
| DBA | GRANT TABLE | NO | RESOURCE | SELECT SEQUENCE | NO |
| DBA | GRANT ANY TABLE | NO | RESOURCE | GRANT SEQUENCE | NO |
| DBA | CREATE ANY VIEW | NO | RESOURCE | EXECUTE PACKAGE | NO |
| DBA | ALTER ANY VIEW | NO | RESOURCE | GRANT PACKAGE | NO |
| DBA | DROP ANY VIEW | NO | RESOURCE | SELECT ANY DICTIONARY | NO |
| DBA | INSERT VIEW | NO | RESOURCE | CREATE MATERIALIZED VIEW | NO |
| DBA | INSERT ANY VIEW | NO | RESOURCE | SELECT MATERIALIZED VIEW | NO |
| DBA | UPDATE VIEW | NO | RESOURCE | CREATE DOMAIN | NO |
| DBA | UPDATE ANY VIEW | NO | RESOURCE | GRANT DOMAIN | NO |
| DBA | DELETE VIEW | NO | RESOURCE | USAGE DOMAIN | NO |
| DBA | DELETE ANY VIEW | NO | RESOURCE | DUMP TABLE | NO |
| DBA | SELECT VIEW | NO | PUBLIC | INSERT TABLE | NO |
| DBA | SELECT ANY VIEW | NO | PUBLIC | UPDATE TABLE | NO |
| DBA | GRANT VIEW | NO | PUBLIC | DELETE TABLE | NO |
| DBA | GRANT ANY VIEW | NO | PUBLIC | SELECT TABLE | NO |
| DBA | CREATE ANY PROCEDURE | NO | PUBLIC | REFERENCES TABLE | NO |
| DBA | DROP ANY PROCEDURE | NO | PUBLIC | GRANT TABLE | NO |
| DBA | EXECUTE PROCEDURE | NO | PUBLIC | INSERT VIEW | NO |
| DBA | EXECUTE ANY PROCEDURE | NO | PUBLIC | UPDATE VIEW | NO |
| DBA | GRANT PROCEDURE | NO | PUBLIC | DELETE VIEW | NO |
| DBA | GRANT ANY PROCEDURE | NO | PUBLIC | SELECT VIEW | NO |
| DBA | CREATE ANY SEQUENCE | NO | PUBLIC | GRANT VIEW | NO |
| DBA | DROP ANY SEQUENCE | NO | PUBLIC | EXECUTE PROCEDURE | NO |
| DBA | SELECT SEQUENCE | NO | PUBLIC | GRANT PROCEDURE | NO |
| DBA | SELECT ANY SEQUENCE | NO | PUBLIC | SELECT SEQUENCE | NO |
| DBA | GRANT SEQUENCE | NO | PUBLIC | GRANT SEQUENCE | NO |
| DBA | GRANT ANY SEQUENCE | NO | PUBLIC | EXECUTE PACKAGE | NO |
| DBA | CREATE ANY TRIGGER | NO | PUBLIC | GRANT PACKAGE | NO |
| DBA | DROP ANY TRIGGER | NO | PUBLIC | SELECT ANY DICTIONARY | NO |
| DBA | CREATE ANY INDEX | NO | PUBLIC | SELECT MATERIALIZED VIEW | NO |
| DBA | ALTER ANY INDEX | NO | PUBLIC | GRANT DOMAIN | NO |
| DBA | DROP ANY INDEX | NO | PUBLIC | USAGE DOMAIN | NO |
| DBA | CREATE ANY CONTEXT INDEX | NO | PUBLIC | DUMP TABLE | NO |
| DBA | ALTER ANY CONTEXT INDEX | NO | DB_AUDIT_ADMIN | CREATE USER | NO |
| DBA | DROP ANY CONTEXT INDEX | NO | DB_AUDIT_ADMIN | ALTER USER | NO |
| DBA | CREATE ANY PACKAGE | NO | DB_AUDIT_ADMIN | DROP USER | NO |
| DBA | DROP ANY PACKAGE | NO | DB_AUDIT_ADMIN | AUDIT DATABASE | YES |
| DBA | EXECUTE PACKAGE | NO | DB_AUDIT_ADMIN | SELECT ANY DICTIONARY | NO |
| DBA | EXECUTE ANY PACKAGE | NO | DB_AUDIT_ADMIN | CREATE PROFILE | NO |
| DBA | GRANT PACKAGE | NO | DB_AUDIT_ADMIN | ALTER PROFILE | NO |
| DBA | GRANT ANY PACKAGE | NO | DB_AUDIT_ADMIN | DROP PROFILE | NO |
| DBA | CREATE ANY LINK | NO | DB_AUDIT_OPER | AUDIT DATABASE | NO |
| DBA | DROP ANY LINK | NO | DB_AUDIT_OPER | SELECT ANY DICTIONARY | NO |
| DBA | CREATE ANY SYNONYM | NO | DB_AUDIT_PUBLIC | SELECT ANY DICTIONARY | NO |
| DBA | DROP ANY SYNONYM | NO | DB_POLICY_ADMIN | CREATE USER | NO |
| DBA | DROP PUBLIC SYNONYM | YES | DB_POLICY_ADMIN | ALTER USER | NO |
| DBA | SELECT ANY DICTIONARY | NO | DB_POLICY_ADMIN | DROP USER | NO |
| DBA | ADMIN REPLAY | NO | DB_POLICY_ADMIN | LABEL DATABASE | YES |
| DBA | ADMIN BUFFER | NO | DB_POLICY_ADMIN | SELECT ANY DICTIONARY | NO |
| DBA | CREATE TABLESPACE | YES | DB_POLICY_ADMIN | CREATE PROFILE | NO |
| DBA | ALTER TABLESPACE | YES | DB_POLICY_ADMIN | ALTER PROFILE | NO |
| DBA | DROP TABLESPACE | YES | DB_POLICY_ADMIN | DROP PROFILE | NO |
| DBA | ALTER ANY TRIGGER | NO | DB_POLICY_OPER LABEL | DATABASE | NO |
| DBA | CREATE MATERIALIZED VIEW | YES | DB_POLICY_OPER SELECT | ANY DICTIONARY | NO |
| DBA | CREATE ANY MATERIALIZED VIEW | NO | DB_POLICY_PUBLIC | SELECT ANY DICTIONARY | NO |
| DBA | DROP ANY MATERIALIZED VIEW | NO |
完整示例
CREATE TABLESPACE DMTEST DATAFILE 'DMTEST_DATA01.dbf' SIZE 10240;
CREATE TABLESPACE DMTEST_IDX DATAFILE 'DMTEST_IDX01.dbf' SIZE 2048;
CREATE USER "DMTEST" IDENTIFIED BY "DMTEST1234" DEFAULT TABLESPACE "DMTEST" DEFAULT INDEX TABLESPACE "DMTEST_IDX";
CREATE TABLE "DMTEST"."TEST"
(
"ID" VARCHAR(20),
"NAME" VARCHAR(100)) STORAGE(ON "DMTEST", CLUSTERBTR) ;
COMMENT ON COLUMN "DMTEST"."TEST"."ID" IS 'id';
COMMENT ON COLUMN "DMTEST"."TEST"."NAME" IS '姓名';
CREATE ROLE dmtest_role;
grant INSERT ANY TABLE to dmtest_role;
grant create table to dmtest_role;;
grant create view to dmtest_role;
GRANT dmtest_role TO DMTEST;
grant CREATE SESSION to dmtest_role;
grant RESTORE DATABASE to dmtest_role;
grant CREATE SCHEMA to dmtest_role;
grant BACKUP DATABASE to dmtest_role;
GRANT soi TO DMTEST;
GRANT SELECT ON DBA_OBJECTS TO DMTEST;
commit;