Sql server 如何在共享数据库上同时生成唯一的用户名?

Sql server 如何在共享数据库上同时生成唯一的用户名?,sql-server,database,concurrency,uniqueidentifier,identifier,Sql Server,Database,Concurrency,Uniqueidentifier,Identifier,我需要自动生成帐户名。它们将用于访问我的服务的用户软件中,因此它们不一定好看。我想任何足够长的字母数字字符串都可以。假设我已经有了一个生成足够好的字母数字字符串的算法 有两个主要需求:它们必须是唯一的,并且将同时生成。具体来说,我的服务将在多台计算机上运行,所有副本都将访问同一个共享数据库。我需要以这样的方式生成这些用户名,即没有两个节点生成相同的用户名 我该怎么做?我是否应该放弃这个想法而使用guid?有没有一种更漂亮的方式可以为该场景使用GUI?以下其中之一: 使用GUID(uniquei

我需要自动生成帐户名。它们将用于访问我的服务的用户软件中,因此它们不一定好看。我想任何足够长的字母数字字符串都可以。假设我已经有了一个生成足够好的字母数字字符串的算法

有两个主要需求:它们必须是唯一的,并且将同时生成。具体来说,我的服务将在多台计算机上运行,所有副本都将访问同一个共享数据库。我需要以这样的方式生成这些用户名,即没有两个节点生成相同的用户名

我该怎么做?我是否应该放弃这个想法而使用guid?有没有一种更漂亮的方式可以为该场景使用GUI?

以下其中之一:

  • 使用GUID(uniqueidentifier数据类型),但不要将其用作聚集索引
  • 使用标识列
如果在多个节点上使用SQL Server复制(编辑:以前考虑得太多)

  • 使用每个节点设置范围的标识列(例如-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复制中使用多个节点