我有一个XSA系统和XSA数据库用户。该XSA DB用户将用于在XSA中创建新的Hana数据库用户。我正在尝试通过execBatch()功能创建一批用户。我对node.js项目有一个上限。
我正在node.js文件中执行sql查询。以下是代码-
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');
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句