达梦数据库常用语句示例

达梦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;
相关推荐
Elastic 中国社区官方博客1 小时前
Elasticsearch:使用向量搜索构建现代应用的最佳实践
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索
Volunteer Technology1 小时前
Flink状态管理与容错(一)
大数据·数据库·flink
CIO_Alliance1 小时前
(企业AI化转型)选对iPaaS系统集成厂家是制造业数字化转型的生死线
大数据·数据库·人工智能·企业数字化转型·ipaas·系统集成
南部余额2 小时前
Canal解决MySQL与Redis数据一致性问题
数据库·redis·mysql·canal·数据·数据同步
睡不醒男孩0308232 小时前
CLup篇之数据库传统运维对比
运维·数据库
梓䈑2 小时前
C++大模型统一接入引擎(第三篇):模型管理、会话持久化与SDK门面封装的完整实现
数据库·c++
日取其半万世不竭3 小时前
PostgreSQL 跑在 Docker 里怎么备份?恢复成功才算备份成功
数据库·docker·postgresql
奈斯ing3 小时前
花了三个月,我写了个RDS管控平台(目前进度一半)
数据库·管控平台
Hoxy.R3 小时前
记录一次 Oracle 10g USERS 表空间在线扩容
数据库·oracle