Unieke ID voor meerdere SQL-servers

Ik ontwikkel software die in meerdere gevallen in het hele land zal worden gebruikt. Zoals zoveel software die logins gebruikt, heb ik voor elke gebruiker een unieke ID nodig. Elke instantie van de software moet volledig onafhankelijk werken, maar de kans is groot dat uiteindelijk enkele databases worden gecombineerd. In dit geval zou ik willen dat de ID voor elke gebruiker uniek is op alle servers.

Zonder communicatie tussen de servers (ze dienen alleen LAN's), ik dacht dat misschien een ID van een tijdstempel tot milliseconden zou kunnen werken. Met een gebruikerspool van slechts duizenden en niet miljoenen, is de kans klein dat één gebruiker wordt gemaakt met dezelfde milliseconde als een andere gebruiker op een andere server.

Bestaat er echt een manier om een ​​unieke ID voor alle servers te garanderen zonder onderlinge communicatie?

2
toegevoegd de auteur Brian Roach, de bron

4 antwoord

Gebruik het gegevenstype 16-byte uniqueidentifier

Een voorbeeld zou zijn

SELECT NEWID()
GO
-- This will return a new random uniqueidentifier e.g.
E75B92A3-3299-4407-A913-C5CA196B3CAB

Om deze Guid in een variabele te selecteren

--assign uniqueidentifier in a variable
DECLARE @EmployeeID uniqueidentifier
SET @EmployeeID = NEWID()
You can directly use this with INSERT statement to insert new row in table.

- Gegevens invoegen in de tabel Werknemers.

INSERT INTO Employees
(EmployeeID, Name, Phone)
VALUES
(NEWID(), 'John Kris', '99-99999')

voorbeelden waren van hier , als u meer informatie wilt

5
toegevoegd
Je bedoelt 16 byte ....? UUID's zijn groter dan 16 bits.
toegevoegd de auteur BG100, de bron
Bedankt voor de geweldige links en voorbeelden!
toegevoegd de auteur Indigenuity, de bron

Ja, u kunt dit vrij eenvoudig doen door het gebruik van automatisch opgehaalde ID's die toenemen met een veelvoud van het aantal servers dat u heeft, maar beginnend met een ander nummer.

Als u bijvoorbeeld 3 databases heeft:

Server 1: IDs increment by 3 starting from 1 E.g. 1, 4, 7, 10
Server 2: IDs increment by 3 starting from 2 E.g. 2, 5, 8, 11
Server 3: IDs increment by 3 starting from 3 E.g. 3, 6, 9, 12
4
toegevoegd
@Doozer: Ja, maar je kunt gewoon een hoog genoeg vermenigvuldiger zoals 20 kiezen, die voor maximaal 20 servers toestaat ... je hoeft niet alle ID's te gebruiken.
toegevoegd de auteur BG100, de bron
@Brian: ja, ik ben het ermee eens dat UUID waarschijnlijk de beste oplossing is in de meeste situaties, maar er zijn redenen waarom eenvoudige integer ID's de voorkeur verdienen. Zonder meer te weten over de database van het OP is het moeilijk te zeggen welke methode het beste werkt.
toegevoegd de auteur BG100, de bron
Ik zal waarschijnlijk uiteindelijk UUID gebruiken, maar ik ben het ermee eens, een eenvoudige ID zou erg leuk zijn. Een andere gedachte die ik had was om een ​​variabele te gebruiken van het installeren van de software (zoals locatie) en dat toe te voegen aan het einde van een incrementele waarde op elke server. Bedankt voor het idee!
toegevoegd de auteur Indigenuity, de bron
@ BG100 - Als er niet zoiets als een UUID zou zijn, zou dit de verdienste zijn. Zoals het is, is er geen praktische reden om dit te doen en misschien schilder je jezelf in een hoek op de weg.
toegevoegd de auteur Brian Roach, de bron
@onedaywhen - Nou laten we eens kijken, als ik "20" kies en dan 3 jaar vanaf nu de 21e server moet toevoegen, zou ik zeggen dat ik behoorlijk ver in die hoek zit. Ik heb dat probleem niet als ik gewoon een UUID gebruik.
toegevoegd de auteur Brian Roach, de bron
+1 omdat het een interessant idee is, maar -1 omdat het EXTREEM beperkt is in het aantal implementaties
toegevoegd de auteur JNK, de bron
Ander, maar slim idee. Je zou echter moeten weten hoeveel instanties je zou hebben geïnstalleerd om de 3 in te vullen, en ze zouden gerepareerd zijn.
toegevoegd de auteur Doozer Blake, de bron
@ BG100 Ja, dat begrijp ik. Op een gegeven moment zou je een schaalprobleem kunnen tegenkomen. Denk dat het allemaal afhangt van wat de OP betekent door meerdere instanties.
toegevoegd de auteur Doozer Blake, de bron
Deze aanpak zal niet werken en zou niet aanbevolen moeten worden omdat je beperkt bent tot slechts 3 sequenties, bijvoorbeeld, als je 4 gebruikt, is je reeks 4, 7, 10; maar de reeks voor 1 is al 1, 4, 7, 10. Deze benadering kan alleen werken als je de reeks begint bij 1, 2 en 3. Het maximale aantal waarden zou Int32/3 zijn.
toegevoegd de auteur Parmenion, de bron
@BrianRoach: "schilder jezelf in een hoek op de weg" - ik heb problemen met het voorstellen van dat;)
toegevoegd de auteur onedaywhen, de bron
@BrianRoach: maar in die 20 jaar is het waarschijnlijk dat de weg opnieuw moet worden opgedoken en wat als de verf eigenlijk alleen maar punthaken is?
toegevoegd de auteur onedaywhen, de bron

Heeft u het veldtype uniqueidentifier (GUID) geprobeerd?

4
toegevoegd
+1 Je slaat me secondenlang ...
toegevoegd de auteur Adrian Carneiro, de bron

UUID (GUID) is het beste voor uw geval

2
toegevoegd