为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:dm8
【操作系统】:
【CPU】:
【问题描述】*:报错如下,有模式testaaa和testbbb,表空间也有testaaa和testbbb,用户也存在testaaa和testbbb
不能这样授权,模式testaaa下面有多少表,就每张表单独授予查询权限给testbbb,参考这个语句:select 'grant select on testaaa.'||table_name||' to testbbb;' from user_tables; 这个语句查询生成的语句拷贝出来用testaaa执行就可以了。
1、对于报错的“无效数据库对象”问题是由于你添加了双引号,强制转为了小写,可以去掉双引号或者改为大写。
2、就模式授权需要确定你现使用的版本是否有参数GRANT_SCHEMA,可以使用如下语句查询:
select * from V$DM_INI where para_name='GRANT_SCHEMA';
如有没有该参数说明现有版本不支持模式方式授权,如有可将dn,ini文件中该参数修改为1,该参数为静态参数,需要重启DM服务生效。
授权语句:
grant select on 模式名 to user;
如果你加了双引号导致数据库识别不到对象,说明你的数据库是大小写敏感的环境,你这里可以去掉双引号再次操作,(GRANT_SCHEMA参数需要设置成1的前提下进行授权操作)环境信息具体可以查看
-- 1.字符集
SELECT 'UNICODE字符集',DECODE(UNICODE,'0','0-GB18030','1','UTF-8','2','EUC-KR') union
-- 2.大小写敏感
SELECT 'CASE_SENSITIVE大小写敏感',DECODE(SF_GET_CASE_SENSITIVE_FLAG,'0','N-不敏感','1','Y-敏感')union
-- 3.char是否以字符为单位
SELECT 'LENGTH_IN_CHAR是否以字符为单位',DECODE(PARA_VALUE,0,'0-否',1,'1-是') FROM V$DM_INI WHERE "V$DM_INI".PARA_NAME='LENGTH_IN_CHAR' union
-- 4.页大小,DM建议32K
select 'page_size页大小',page()/1024||'KB' union
SELECT '簇大小',cast(SF_GET_EXTENT_SIZE() as varchar) union
-- 5. 兼容性
select 'COMPATIBLE_MODE数据库兼容',DECODE(PARA_VALUE,0,'不兼容',1,'1-SQL92',2,'2-Oracle',3,'3-MSSQLServer',4,'4-MySQL',5,'5-DM6',6,'6-Teradata') from v$dm_ini where para_name='COMPATIBLE_MODE' union
-- 6.其他,关键字,特殊参数
select 'EXCLUDE_RESERVED_WORDS关键字过滤',PARA_VALUE from v$dm_ini where para_name='EXCLUDE_RESERVED_WORDS' union
--7. 空格填充,Oracle兼容必选
select 'BLANK_PAD_MODE空格填充',PARA_VALUE from v$dm_ini where para_name LIKE '%BLANK_PAD_MODE%' union
--8.DIRECT_IO,频繁IO推荐用0
select 'DIRECT_IO',PARA_VALUE from v$dm_ini where para_name ='DIRECT_IO';
对于大小写敏感的说明:
DM 中的大小写敏感指的是包括对象名敏感+列值大小写字符敏感(这里的是否敏感使用初始化参数 CASE_SENSITIVE 进行指定)
● 敏感
○ 大写对象 T 和小写 t 对象为 2 个对象,其中小写对象需要使用双引号进行指定
■ 如 表"t" 和 T 指的是 2 个表;
■ 列"Id"和 id 指的是 2 个列
○ 不特意添加双引号指定对象为小写时,默认转为大写存储
■ create table t(id int); 查询 user_tables 名称将显示为 T;
■ 表 t 和 T 指的是 1 个表;
■ 列Id、ID、iD 和 id 指的是 1 个列
○ 对象查询时,查询小写对象必须 以双引号包裹,否则查询对象为大写对象
■ 如 查询表"t"需要写成 select * from "t";
○ 列值大小写字符敏感,查大写只返回大写,查小写只返回小写
■ 如 select * from t where name ='Ab'; 将返回 name='Ab'的行,不会返回'AB'、'ab'、'aB' 的行
● 不敏感
○ 大写对象和小写对象为 1 个对象,即使创建对象时使用双引号指定也是一样的
■ 如 表"t"与 T 是 1 个表
■ 列"Id"和 id 、ID、iD 指的是 1 个列
○ 对象存储时以对象创建时的大小写为准,无需用户手动添加双引号,系统自动处理,如,创建时使用小写,存储的就是小写
■ 如 create table tT(id int); 查询 user_tables 名称将显示为 tT
○ 对象查询时不区分对象大小写,即使查询时加双引号也是一样,查询的都是同一个对象
■ 如 查询表"t",可以写成 select * from "t"; 或 select * from t; 或 select * from T;
○ 查询列值时不区分大小写,查询大写字符或小写字符都将返回大写+小写
■ 如 select * from t where name ='Ab'; 将返回 name='Ab'、'AB'、'ab'、'aB' 的行
对比 Oracle:表现同 DM-敏感情况
对比 MySQL 中的敏感配置分为对象名敏感、文件系统上的文件名敏感、列值字符敏感
● 对象名敏感相关参数:lower_case_table_names=0 表示库中对象名统一小写存储
● 文件系统上的文件名敏感相关参数:lower_case_file_system,OFF表示文件名区分大小写,ON表示不区分大小写。
● 列值大小写字符默认不敏感,如果需要返回敏感的结果,相关配置:
○ 通过排序集进行配置,如创建表的时候指定collate为utf8_bin 或指定列的排序集
○ binary 查询可以匹配与指定字符大小写一致的字符