Teradata含‘-’和‘.’特殊字符数据库的权限授予及游标批量执行方案问询
解决Teradata含特殊字符对象名的批量授权问题
Teradata对对象名(数据库、表、视图等)的语法有严格要求,当名称包含连字符(-)这类非标准字符时,必须用双引号将对象名包裹起来,否则解析器会把特殊字符当成语法分隔符,导致你遇到的“Fad与‘-’之间缺少预期内容”错误。
针对你用游标批量授权的场景,只需要修改动态SQL的拼接逻辑,把获取到的数据库名用双引号包裹即可。修改后的代码如下:
For Rights_Grant as GETINDEX Cursor for SELECT DATABASENAME FROM DBC.DATABASES Do SET DB_NAME = Rights_GRANT.DATABASENAME; SET SQL_TEXT = 'Grant Dump, restore, select on "' || DB_NAME || '" to Backup_1;'; -- 执行拼接好的动态SQL(存储环境下需添加此句) EXECUTE IMMEDIATE :SQL_TEXT; End For;
关键说明:
- 双引号的作用:用
"|| DB_NAME ||"拼接后,最终生成的授权语句会变成:
双引号会让Teradata将里面的内容视为完整的对象标识符,忽略其中的特殊字符,避免语法解析错误。Grant Dump, restore, select on "FAD-Data.Practice" to Backup_1; - 动态SQL执行:如果是在存储过程中使用这段逻辑,别忘了添加
EXECUTE IMMEDIATE :SQL_TEXT;来执行拼接好的授权语句;如果是BTEQ脚本,可根据环境直接执行变量内容。 - 权限前提:执行该操作的用户需要拥有目标数据库的
GRANT权限,或者具备DBA级别的权限,否则会出现权限不足的错误。
内容的提问来源于stack exchange,提问作者fahad pirzada
相关产品推荐
相关产品推荐

