رضا عربلو
سه شنبه 04 تیر 1387, 19:39 عصر
نمی دونم مشکل از من است و یا از Constraint ام ویا ....
برای اینکه بهتر توضیح بدهم جدول زیر را در نظر بگیرید:
CREATE TABLE [dbo].[tblUsers](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](256) COLLATE Arabic_CI_AS NOT NULL,
[Password] [nvarchar](256) COLLATE Arabic_CI_AS NOT NULL,
[DefaultAccessLevelId] [int] NOT NULL,
CONSTRAINT [PK_tblUsers] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
برای اینکه اجازه ندهم دو تا کاربر Username یکسانی داشته باشند (حروف بزرگ و کوچک یکسان هستند). یک همچین فانکشنی نوشتم.
CREATE FUNCTION [dbo].[GettblUsersConflict]()
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultCount int;
set @ResultCount=0;
SELECT @ResultCount=COUNT(*) FROM dbo.tblUsers
GROUP BY Lower(Username)
Having COUNT(*)>1
RETURN @ResultCount
END
و بر روی جدولم همچین Constraintی گذاشتم.
ALTER TABLE [dbo].[tblUsers] WITH CHECK ADD CONSTRAINT [CK_tblUsers] CHECK (([dbo].[GettblUsersConflict]()=(0)))
همه چیز خوب پیش می رفت تا اینکه امروز داشتم SP زیر را چک می کردم.
CREATE PROCEDURE [dbo].[SPtblUsers_UpdateAllInfo]
(
@UserId int,
@UserName nvarchar(256),
@Password nvarchar(256),
@DefaultAccessLevelId int,
@UserFirstName nvarchar(256),
@UserLastName nvarchar(256),
@CreateDate datetime,
@IsEnabled bit,
@IsLockedOut bit,
@LockoutDate datetime,
@LastLoginDate datetime,
@FailedPasswordAttemptCount int,
@FailedPasswordAttemptDate datetime,
@Comment ntext
)
AS
SET NOCOUNT OFF;
BEGIN TRANSACTION T1;
BEGIN TRY
UPDATE [tblUsers] SET [UserName] = @UserName, [Password] = @Password, [DefaultAccessLevelId] = @DefaultAccessLevelId WHERE ([UserId] = @UserId);
UPDATE [tblMemberships] SET [UserId] = @UserId, [UserFirstName] = @UserFirstName, [UserLastName] = @UserLastName, [CreateDate] = @CreateDate, [IsEnabled] = @IsEnabled, [IsLockedOut] = @IsLockedOut, [LockoutDate] = @LockoutDate, [LastLoginDate] = @LastLoginDate, [FailedPasswordAttemptCount] = @FailedPasswordAttemptCount, [FailedPasswordAttemptDate] = @FailedPasswordAttemptDate, [Comment] = @Comment WHERE ([UserId] = @UserId);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION T1;
ELSE
RAISERROR ('Update Unsuccessfull',
10,
1,
N'abcde');
با کمال تعجب دیدم هنگامی که sp ام Constraint ام را نقض می کند برخی رکورد ها Update شده اند و برخی نه.
آیا این نحو تعریف constraint صحیح است.
لطفاً من را از تاریکی بیرون بیاورید.
برای اینکه بهتر توضیح بدهم جدول زیر را در نظر بگیرید:
CREATE TABLE [dbo].[tblUsers](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](256) COLLATE Arabic_CI_AS NOT NULL,
[Password] [nvarchar](256) COLLATE Arabic_CI_AS NOT NULL,
[DefaultAccessLevelId] [int] NOT NULL,
CONSTRAINT [PK_tblUsers] PRIMARY KEY CLUSTERED
(
[UserId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
برای اینکه اجازه ندهم دو تا کاربر Username یکسانی داشته باشند (حروف بزرگ و کوچک یکسان هستند). یک همچین فانکشنی نوشتم.
CREATE FUNCTION [dbo].[GettblUsersConflict]()
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @ResultCount int;
set @ResultCount=0;
SELECT @ResultCount=COUNT(*) FROM dbo.tblUsers
GROUP BY Lower(Username)
Having COUNT(*)>1
RETURN @ResultCount
END
و بر روی جدولم همچین Constraintی گذاشتم.
ALTER TABLE [dbo].[tblUsers] WITH CHECK ADD CONSTRAINT [CK_tblUsers] CHECK (([dbo].[GettblUsersConflict]()=(0)))
همه چیز خوب پیش می رفت تا اینکه امروز داشتم SP زیر را چک می کردم.
CREATE PROCEDURE [dbo].[SPtblUsers_UpdateAllInfo]
(
@UserId int,
@UserName nvarchar(256),
@Password nvarchar(256),
@DefaultAccessLevelId int,
@UserFirstName nvarchar(256),
@UserLastName nvarchar(256),
@CreateDate datetime,
@IsEnabled bit,
@IsLockedOut bit,
@LockoutDate datetime,
@LastLoginDate datetime,
@FailedPasswordAttemptCount int,
@FailedPasswordAttemptDate datetime,
@Comment ntext
)
AS
SET NOCOUNT OFF;
BEGIN TRANSACTION T1;
BEGIN TRY
UPDATE [tblUsers] SET [UserName] = @UserName, [Password] = @Password, [DefaultAccessLevelId] = @DefaultAccessLevelId WHERE ([UserId] = @UserId);
UPDATE [tblMemberships] SET [UserId] = @UserId, [UserFirstName] = @UserFirstName, [UserLastName] = @UserLastName, [CreateDate] = @CreateDate, [IsEnabled] = @IsEnabled, [IsLockedOut] = @IsLockedOut, [LockoutDate] = @LockoutDate, [LastLoginDate] = @LastLoginDate, [FailedPasswordAttemptCount] = @FailedPasswordAttemptCount, [FailedPasswordAttemptDate] = @FailedPasswordAttemptDate, [Comment] = @Comment WHERE ([UserId] = @UserId);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION T1;
ELSE
RAISERROR ('Update Unsuccessfull',
10,
1,
N'abcde');
با کمال تعجب دیدم هنگامی که sp ام Constraint ام را نقض می کند برخی رکورد ها Update شده اند و برخی نه.
آیا این نحو تعریف constraint صحیح است.
لطفاً من را از تاریکی بیرون بیاورید.