问题描述
我有一个XSA系统和XSA数据库用户。该XSA DB用户将用于在XSA中创建新的Hana数据库用户。我正在尝试通过execBatch()功能创建一批用户。我有一个node.js项目的上限。
console.log("targeting User Creation")
try{
let createuserstatement = await xsaDbConn.preparePromisified("CREATE USER ? PASSWORD AbcYes NO FORCE_FirsT_PASSWORD_CHANGE")
await createuserstatement.execBatch(createusersarr)
console.log(`Users created.`)
}catch(err){
console.log(err.stack)
}
createusersarr是包含要创建的用户列表的数组。数组看起来像这样-
[ [ 'SAC_XSA_HDB_USER_ABC1' ],[ 'SAC_XSA_HDB_USER_ABC2' ],[ 'SAC_XSA_HDB_USER_ABC3' ],[ 'SAC_XSA_HDB_USER_ABC4' ],[ 'SAC_XSA_HDB_USER_ABC5' ],[ 'SAC_XSA_HDB_USER_ABC6' ],[ 'SAC_XSA_HDB_USER_ABC7' ],[ 'SAC_XSA_HDB_USER_ABC8' ],[ 'SAC_XSA_HDB_USER_ABC9' ],[ 'SAC_XSA_HDB_USER_ABC10' ] ]
当我运行节点应用程序时,
ERROR - targeting User Creation
undefined
我不确定为什么会失败?当我使用exec()而不是execBatch()并在创建用户查询(基本循环机制)中一一提供用户名时,它运行良好。
解决方法
要解决该问题,可以使用HANA Studio或XSA SQL控制台来查看该语句CREATE USER ? PASSWORD "qwe"
不能使用占位符。这里的用户名是一个对象,占位符仅是参数,它们不能替代对象名。
我没有找到doc链接(这是SAP,所以并不感到惊讶),但是在其他数据库中却可以这样工作。
编辑: “对象”是指在数据库系统表中保留的东西:表,视图,序列,功能,用户,角色,特权等。它是模型或系统的一部分,您可以“使用” ”(调用,选择,创建,更改等)。它是语法的一部分(在文档中可以找到它)。数据是您可以操纵的内容,并且可以用占位符代替。当然,元数据也存储在某个地方,但这是另一个抽象层次。
要使您的用户名成为数据,您应该编写一些过程来获取用户名,创建SQL语句并用EXECUTE IMMEDIATE
发出该语句(因此它要求SQL解析器按原样解析整个字符串)。然后,您应该使用?作为用户名参数,并传递要创建的动态用户名。
create procedure p_create_user( in p_uname nvarchar(20))
language sqlscript
sql security invoker
as
begin
declare lv_sql nvarchar(1000);
lv_sql := replace('create user <uname> password "QWEasd!23"','<uname>',p_uname);
execute immediate lv_sql;
end;
call p_create_user('demo');