问题描述
HANA Database USERS表中的USER_NAME字段/列是否唯一?我看到的只是USER_ID值中的数字。
就像SAP USR02表中的BNAME一样,我想知道HANA DB USERS表中的唯一(或等效于bname)值字段是什么。
解决方法
Amandeep Modgil的回答没有错,但并未完全回答问题。
当然,该文档明确指出,SAP HANA中的用户名必须唯一。但是,它没有具体说明是否或如何强制执行/保证。
找出类似问题的“ DB开发方式”是检查HANA用于存储用户的表结构。
通过查看PUBLIC.USERS
对象,我们意识到:这不是一个表,而是一个视图。
视图没有分配任何约束,因此任何主键或唯一约束都必须使用该视图引用的表之一来实现。
下一步是查看该视图的源代码。在SAP HANA Studio中,只需在SQL编辑器中标记视图的名称,然后从上下文菜单中选择“显示定义” 。
对于PUBLIC.USERS
,这将打开两个(!)新窗口:
- 一个用于
PUBLIC
的公共同义词(实际上没有USERS
模式,只是同义词) - 和另一个视图
SYS.USERS
此SYS
模式是实现SAP HANA系统对象的位置,因此在此处找到USERS
的视图也就不足为奇了。
在我的HANA Express 2.00.045系统中,该视图的源代码令人惊讶地始于
CREATE **ROW TABLE** "SYS"."USERS" ( "USER_NAME","USER_ID","USERGROUP_NAME" ...
至少这是奇怪的,我怀疑这可能是一个错误,因为该对象的所有其他元数据条目都清楚地表明这实际上是一个视图。
但是我离题了...
要回答的问题是:USER_NAME
的唯一性在哪里实施?
向下滚动FROM
视图的最后一个主要SYS.USERS
子句,指向一个表:SYS.P_USERS_
。
名称中的结尾下划线表示这是内部 HANA对象,任何用户或应用程序都不得直接使用它。但这并不能阻止我们研究它。但是,需要适当的特权。 “普通”应用程序用户帐户可能无法直接查看此表的定义。在这种情况下,我只是使用SYSTEM
用户。
无论如何,我们使用与以前相同的技术:在SQL编辑器中标记SYS.P_USERS_
表,选择“显示定义”,然后得到:在SAP HANA中保存用户帐户的表的定义。 / p>
前三列的定义如下:
Name SQL Data Type Dimension Column Store Data Type Key Not Null
OID BIGINT FIXED X
NAME NVARCHAR 256 STRING
LAST_SUCCESSFUL_CONNECT TIMESTAMP LONGDATE ...
请注意,此表上没有定义否主键,只有OID
有NOT NULL
约束吗?
很显然,表约束不能保证NAME
的唯一性。
那还有什么呢?
让我们切换到表定义的Indexes
标签,我们发现:
-
IDX_P_USERS_OID
,索引列:"OID" ASC
-
IDX_P_USERS_NAME
,索引列:"NAME" ASC
AND 设置 Unique
-标志。
我们有:
OID
(暴露为USER_ID
)和NAME
(暴露为USER_NAME
)在SAP HANA中都是唯一的,由包含这些用户帐户条目的内部表上的唯一索引强制执行
您可以在下面的SAP门户链接上查找架构信息:
尽管它不会告诉您特定的列是主键还是唯一的,但是您可以将此信息与来自以下系统视图的数据结合起来,以获得所需的信息。
我在下面的屏幕截图中突出显示了所需的表格系统视图中的列