SELECT *
FROM tempdb.sys.tables T
WHERE T.name LIKE N'#Private[_]%';
查找页面
SELECT T.name,
T.[object_id],
AU.type_desc,
AU.first_page,
AU.data_pages,
P.[rows]
FROM tempdb.sys.tables T
JOIN tempdb.sys.partitions P
ON P.[object_id] = T.[object_id]
JOIN tempdb.sys.system_internals_allocation_units AU
ON (AU.type_desc = N'IN_ROW_DATA' AND AU.container_id = P.partition_id)
OR (AU.type_desc = N'ROW_OVERFLOW_DATA' AND AU.container_id = P.partition_id)
OR (AU.type_desc = N'LOB_DATA' AND AU.container_id = P.hobt_id)
WHERE T.name LIKE N'#Private%';
#temporary 表仅在创建它的会话中可见。因此,即使是同一用户在另一个会话中也无法看到它。如果您在 SQLCMD 中加载一个临时表,它将对该 SQLCMD 实例可见。因此,后续命令可以将数据加载到永久表中,或者在其上打开游标并为每一行调用存储过程,等等。
或者,您可以为用户提供私有模式并将数据加载到那里的永久表中。那么其他用户(数据库所有者或其他特权用户除外)将无法读取它。然后用户可以稍后将数据移动到另一个模式中。
不幸的是,如果您的威胁模型包括数据库管理员,答案是否定的。
您对该威胁模型的唯一有效选择是加密数据客户端。对于 SQLCMD,最好和最简单的选择是AlwaysEncrypted ,仅使用Microsoft® Command Line Utilities 13.1 for SQL Server或更高版本。
请参阅Paul White 关于查看另一个会话的临时表的文章,归结为
找到#temp表
查找页面
阅读所谓的私人数据
然后使用 m_nextPage 字段读取下一页(它是 file_id : page_id)十进制格式。