Sql server 如何在共享数据库上同时生成唯一的用户名?
我需要自动生成帐户名。它们将用于访问我的服务的用户软件中,因此它们不一定好看。我想任何足够长的字母数字字符串都可以。假设我已经有了一个生成足够好的字母数字字符串的算法 有两个主要需求:它们必须是唯一的,并且将同时生成。具体来说,我的服务将在多台计算机上运行,所有副本都将访问同一个共享数据库。我需要以这样的方式生成这些用户名,即没有两个节点生成相同的用户名 我该怎么做?我是否应该放弃这个想法而使用guid?有没有一种更漂亮的方式可以为该场景使用GUI?以下其中之一:Sql server 如何在共享数据库上同时生成唯一的用户名?,sql-server,database,concurrency,uniqueidentifier,identifier,Sql Server,Database,Concurrency,Uniqueidentifier,Identifier,我需要自动生成帐户名。它们将用于访问我的服务的用户软件中,因此它们不一定好看。我想任何足够长的字母数字字符串都可以。假设我已经有了一个生成足够好的字母数字字符串的算法 有两个主要需求:它们必须是唯一的,并且将同时生成。具体来说,我的服务将在多台计算机上运行,所有副本都将访问同一个共享数据库。我需要以这样的方式生成这些用户名,即没有两个节点生成相同的用户名 我该怎么做?我是否应该放弃这个想法而使用guid?有没有一种更漂亮的方式可以为该场景使用GUI?以下其中之一: 使用GUID(uniquei
- 使用GUID(uniqueidentifier数据类型),但不要将其用作聚集索引
- 使用标识列
- 使用每个节点设置范围的标识列(例如-1到-1000000、1到100000等)
- 标识列和节点ID列来分隔标识值
CREATE TABLE dbo.CommonName
(
CommonNameID INT IDENTITY(0,1) PRIMARY KEY
,Name NVARCHAR(50) NOT NULL
,LastID INT NOT NULL DEFAULT 0
);
INSERT dbo.CommonName(Name)
VALUES
('JAMES')
,('JOHN')
,('ROBERT')
,('MICHAEL')
,('WILLIAM')
,('DAVID')
,('RICHARD')
,('CHARLES')
,('JOSEPH')
,('THOMAS');
GO
--Test
CREATE TABLE [User](Id INT IDENTITY(1,1) PRIMARY KEY, UserName NVARCHAR(60));
GO
UPDATE dbo.CommonName WITH(ROWLOCK)
SET
LastID = LastID + 1
OUTPUT inserted.Name+CAST(inserted.LastID AS NVARCHAR(10)) INTO [User](UserName)
WHERE CommonNameID = ABS(CHECKSUM(NEWID())) % 10
GO 20 --We need 20 new users
SELECT *
FROM [User] u
ORDER BY u.Id;
--End of test
GO
DROP TABLE dbo.CommonName;
DROP TABLE dbo.[User];
样本输出:
Batch execution completed 20 times.
Id UserName
----------- ------------------------------------------------------------
1 RICHARD1
2 MICHAEL1
3 ROBERT1
4 WILLIAM1
5 ROBERT2
6 JAMES1
7 CHARLES1
8 RICHARD2
9 JOSEPH1
10 THOMAS1
11 ROBERT3
12 MICHAEL2
13 WILLIAM2
14 MICHAEL3
15 THOMAS2
16 THOMAS3
17 WILLIAM3
18 RICHARD3
19 JAMES2
20 RICHARD4
(20 row(s) affected)
如果要测试此代码的并发性问题,可以运行
UPDATE。。。;转到100000
和更新。。。;在SSMS中的两个单独的窗口/查询中转到100
,最后,您可以运行此查询选择用户名,COUNT(*)Num FROM dbo。[User]ORDER BY COUNT(*)DESC
,查看是否可以找到重复项。@Bogdan Sahlen:SQL Server 2008。@sharptooth:啊!如果您指的是客户机节点,那么是的,DB将。我考虑在SQL Server复制中使用多个节点