有这个很好的 SQL Server 函数SUSER_SNAME
可以将server_user_sid转换为用户名。这对于将众所周知的 Windows SID 转换为(可能已本地化的)用户名非常有用。
例子:
SELECT SUSER_SNAME(0x01020000000000052000000021020000)
-- yields 'BUILTIN\USERS' (or, on a German system, 'VORDEFINIERT\Benutzer')
Run Code Online (Sandbox Code Playgroud)
通过一些谷歌搜索和反复试验(=手动创建用户并sys.server_principals
随后检查),我确定了以下等效项:
Built-in User/Group Windows SID SQL Server server_user_sid
BUILTIN\USERS S-1-5-32-545 0x01020000000000052000000021020000
NT AUTHORITY\SYSTEM S-1-5-18 0x010100000000000512000000
Run Code Online (Sandbox Code Playgroud)
将 Windows SID 转换为 SQL Server server_user_sids 的算法是什么?
根据文档(SQL Server 2016 中已弃用的数据库引擎功能),sqlmaint.exe
应该仍然可用(强调我的):
本主题介绍了SQL Server 2016中仍然可用的已弃用的 SQL Server 数据库引擎功能。这些功能计划在SQL Server的未来版本中删除。
...
工具:sqlmaint Utility ...
这是绝对没有列出的上的停止使用的功能列表。
但是,我sqlmaint.exe
在最近安装的 SQL Server 2016 Express 系统上找不到。在以前的版本中,它与sqlserver.exe
.
文档有错吗?还是文件位置移动了?还是我在安装过程中遗漏了什么?
(注意:受到重现此问题的评论的鼓励,我为此创建了一个Microsoft Connect 条目,该条目已迁移到UserVoice。)
我有一个log
带有ID
标识列的表。多年来一切正常;然后,昨天,我在日志中看到以下错误:
该语句已终止。
违反 PRIMARY KEY 约束“PK__log__ID__3B40CD36”。无法在对象“dbo.log”中插入重复键。重复的键值为 (295992)。INSERT INTO log (datum, zeit, benutzer, modul, prozedur, code, zeile, bez1, bez2, tech_info) VALUES ('20151126 00:00:00.000', '19000101 18:26:45.121','Customer,', , '', 'WShop-Trans', 0, '1 Datensätze für Tabelle adresse gesendet.', '', '')
我检查了 IDENTITY 种子,看起来没问题:
查询:DBCC CHECKIDENT(log)
结果:正在检查身份信息:当前身份值“296021”,当前列值“296021”。
DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。查询:SELECT MAX(ID) FROM 日志
结果:296021
表上没有触发器,也没有人弄乱种子值(我是管理数据库服务器的人,所以我很确定)。
到目前为止,这是一次性事件,我无法重现。
我看起来只是一个 SQL Server 故障,但我很好奇:这是一个已知的错误,还是对此有任何其他合理的解释?SQL Server 版本是Microsoft SQL Server 2012 - 11.0.2100.60 (X64)
.
为了完整起见,这里是完整的表脚本:
CREATE TABLE [log](
[datum] [datetime] NULL,
[ID] …
Run Code Online (Sandbox Code Playgroud) 假设我有一个 SELECT 语句,如下所示:
SELECT ..., field1
FROM ...
GROUP BY field1
Run Code Online (Sandbox Code Playgroud)
现在假设我想返回第二个字段field2
. 碰巧,field2 在功能上依赖于field1(例如,field1 和field2 可能来自同一个表,而field1 是该表的主键)。我现在有两种等效的方法可以将 field2 添加到查询中:
选项1:
SELECT ..., field1, field2
FROM ...
GROUP BY field1, field2
Run Code Online (Sandbox Code Playgroud)
选项 2:
SELECT ..., field1, MIN(field2) /* or some other, arbitrary aggregate function */
FROM ...
GROUP BY field1
Run Code Online (Sandbox Code Playgroud)
同样,由于 field2 在功能上依赖于 field1,两个查询都应该返回相同的结果集。
有什么好的理由更喜欢一种选择吗?
当连接因任何原因关闭时,我可以告诉 SQL Server“做某事”(例如释放应用程序级锁)吗?
背景:我想在应用程序级别而不是数据库级别锁定记录。但是,当应用程序崩溃时,我无法释放锁定。基本上,我在我的应用程序中实现以下算法:
function editRecord(recordId):
begin transaction
if (select lockedBy from myTable where id = recordId) is not empty:
commit
show "Sorry, record already in use by ..."
else
update myTable set lockedBy = current_user() where id = recordId
commit
show UI window to let user edit and update record
update myTablet set lockedBy = empty where id = recordId
Run Code Online (Sandbox Code Playgroud)
我试图找出是否有一种简单的方法可以在连接崩溃时摆脱应用程序级锁定。
假设我想要在两个用户提供的相同长度的字母数字值之间带有前缀的所有记录。因此,如果用户输入A010
and A025
,我想返回A0101
, A0200
and A0259
。
我试过的:
显然,我不能使用WHERE myText BETWEEN @from and @to
,因为那不会返回A0259
。
从技术上讲,WHERE LEFT(myText, @len) BETWEEN @from AND @to
, 正是我想要的,但这会扼杀 SARGability。
我可以使用WHERE myText BETWEEN @from and @to + 'zzzzzzzzzzz'
,但这是一个丑陋的黑客,并且可能容易出错。(z
真的是最高字符吗?我是否使用了足够的“填充”字符?)
我可以“分解”范围并搜索每个可能的前缀,例如WHERE (myText LIKE 'A01%' OR myText LIKE 'A020%' OR myText LIKE 'A021%' ...)
,但这是很多工作。
是否有一些我错过的智能解决方案?我可能会使用选项 3 来解决问题(因为我知道允许字符的长度和范围),但我对一般情况很好奇。
如果我直接在 SQL Server Management Studio 中执行我的(简单)查询...
SELECT auftrag_prod_soll.ID
FROM auftrag_prod_soll
WHERE auftrag_prod_soll.auftrag_produktion = 51621
AND auftrag_prod_soll.prod_soll_über = 539363
ORDER BY auftrag_prod_soll.reihenfolge
Run Code Online (Sandbox Code Playgroud)
......一切都很好,很快......
Table 'auftrag_prod_soll'. Scan count 2, logical reads 6, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 102 ms.
Run Code Online (Sandbox Code Playgroud)
...因为 SQL Server 会根据两个过滤条件选择合理的执行计划:
另一方面,如果我的应用程序使用游标执行相同的查询......
declare @p1 int
declare @p3 int
set @p3=4
declare @p4 int
set @p4=1 …
Run Code Online (Sandbox Code Playgroud) performance sql-server execution-plan cursors query-performance
sql-server ×6
performance ×2
aggregate ×1
cursors ×1
group-by ×1
identity ×1
locking ×1
primary-key ×1
users ×1
windows ×1