I want to migrate users and posts from an existing forum I am using to a ASP.NET membership table without using CreateUser. Basically I want to maintain userIDs so that when I migrate posts they continue to associate with the c开发者_如何学运维orrect users. Is there a way to do this or would I be better off just using CreateUser and then finding a way to re-assign the post-by-UserIDs to the correct new IDs?
Thanks
You could create a UserProfile table that you can use to join from the User table to your Post table. This will insulate you from the ASP.NET Membership Provider's internals and can be an extension point for additional user information.
Here's a stored procedure and associated functions that I use to create new users and their profiles:
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
What I would do is I would create a link table between your user's table and ASP membership table where membership ID (email address?) would be related to UserID (Integer?). Then I would build a routine for creating users and populating membership table with users data programmatically - it is a little easier to do through .NET code.
精彩评论