2010-06-02 8 views
9

Chcę migrować użytkowników i posty z istniejącego forum używam do tabeli członkowskiej ASP.NET bez użycia CreateUser. Zasadniczo chcę zachować userIDs, aby po migracji wpisów nadal kojarzyły się z prawidłowymi użytkownikami. Czy istnieje sposób, aby to zrobić, czy lepiej byłoby po prostu użyć CreateUser, a następnie znaleźć sposób, aby ponownie przypisać Post-by-UserID do poprawnych nowych identyfikatorów?Jak mogę utworzyć użytkowników w tabeli członkowskiej ASP.NET bez użycia CreateUser

Dzięki

+2

Co zrobić z tworzeniem kopii zapasowej i odtwarzaniem całej tabeli Użytkownicy (w tym identyfikatory)? – Marek

Odpowiedz

11

Można utworzyć tabelę USERPROFILE, które można wykorzystać do przyłączenia się od stolika do stolika użytkownika Poczty. Będzie to izolować od wewnętrznych elementów dostawcy członkostwa ASP.NET i może być punktem rozszerzenia dla dodatkowych informacji o użytkowniku.

Oto procedura przechowywana i powiązane funkcje, które mogę używać do tworzenia nowych użytkowników i ich profile:

CREATE PROCEDURE [dbo].[CreateUser] 
    @UserName nvarchar(256) 
, @ClearTextPassword nvarchar(128) 
, @Email nvarchar(256) 
, @PostingID uniqueidentifier 

AS 

BEGIN 

DECLARE @ApplicationName nvarchar(256) 
DECLARE @PasswordFormat int 
DECLARE @UnencodedSalt uniqueidentifier 
DECLARE @Password nvarchar(128) 
DECLARE @PasswordSalt nvarchar(128) 
DECLARE @Now DATETIME 
DECLARE @UniqueEmail int 

SET @ApplicationName = 'YOUR_APPLICATION_NAME' 
SET @PasswordFormat = 1 
SET @UnencodedSalt = NEWID() 
SET @PasswordSalt = dbo.base64_encode(@UnencodedSalt) 
SET @Password = dbo.base64_encode(HASHBYTES('SHA1', 
    CAST(@UnencodedSalt as varbinary(MAX)) 
    + CAST(@ClearTextPassword AS varbinary(MAX)))) 
SET @Now = getutcdate() 
SET @UniqueEmail = 1 


BEGIN TRANSACTION 

DECLARE @UserId uniqueidentifier 

EXECUTE [dbo].[aspnet_Membership_CreateUser] 
    @ApplicationName 
    ,@UserName 
    ,@Password 
    ,@PasswordSalt 
    ,@Email 
    ,NULL 
    ,NULL 
    ,1 
    ,@Now 
    ,@Now 
    ,@UniqueEmail 
    ,@PasswordFormat 
    ,@UserId OUTPUT 

INSERT INTO [dbo].[UserProfile] 
(
[UserID] 
,[PostingID] 
) 
VALUES 
(
@UserId 
,@PostingID 
) 

COMMIT 

CREATE FUNCTION [dbo].[base64_decode] 
(@base64_text VARCHAR(max)) 
RETURNS VARBINARY(max) 

WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 

BEGIN 

DECLARE @x XML; SET @x = @base64_text 
RETURN @x.value('(/)[1]', 'VARBINARY(max)') 

END 

CREATE FUNCTION [dbo].[base64_encode] 
(@data VARBINARY(max)) 
RETURNS VARCHAR(max) 

WITH SCHEMABINDING, RETURNS NULL ON NULL INPUT 

BEGIN 

RETURN (

SELECT [text()] = @data 
FOR XML PATH('') 

) 
END 
+0

w rzeczywistości nie używasz tutaj funkcji base64_decode, ale dobrze jest zgadnąć. – robbie

0

Co mogę zrobić, to chciałbym utworzyć tabelę łącza między stołem Twojego użytkownika i ASP tabeli członkostwa gdzie członkostwa ID (adres e-mail?) Byłby powiązany z UserID (Integer?). Następnie zbudowałbym procedurę rutynowego tworzenia użytkowników i zapełniania tabeli członkostwa danymi użytkowników programowo - trochę łatwiej jest to zrobić za pomocą kodu .NET.