سلام
من با استفاده از راهنمایی شما استاد عزیز یه تریگر نوشتم که بعد از درج یک رکورد اطلاعاتی در جدول کاربران به طور خودکار در بانک لاگین و دسترسی های لازم به اون داده میشه. فقط مشکلی که هست من در آخرین مرحله این تریگر کاربر ایجاد شده رو عضو یک رول می کنم (توسط Sp_AddRoleMember) و (Sp_DropRoleMember)که با خطای زیر مبنی بر عدم امکان استفاده از این Sp در یک ترنزیشن مواجه می شوم.
The procedure 'sys.sp_addrolemember' cannot be executed within a transaction.
خواهش می کنم در صورت امکان من رو راهنمایی کنین با تشکر.
متن تریگر :
Alter TRIGGER Opr_AddUserIntoDatabase
ON Users AFTER INSERT
AS
BEGIN
DECLARE @UserName nvarchar(30),
@Password nvarchar(50),
@UserType bit
SELECT @UserName = UserName,
@Password = Password,
@UserType = UserType FROM INSERTED
Declare @Str1 nvarchar(100),
@Str2 nvarchar(100),
@Str3 nvarchar(100),
@Str4 nvarchar(100),
@Str5 nvarchar(100)
Set @Password = (Select QUOTENAME (@Password,''''))
/*--Set Text For Create Login And Grant Permission On Server----------------------*/
Set @Str1 = 'Use Master Create Login ' + @UserName +
' WITH PASSWORD = ' + @Password +
',DEFAULT_DATABASE = MYDB;'
Set @Str2 = 'Use Master Grant Alter Any Login To ' + @UserName +
' WITH GRANT OPTION'
/*--Set Text For Create User And Grant Permission On Database---------------------*/
Set @Str3 = 'Use MYDB Create User ' + @UserName + ' For Login ' + @UserName
Set @Str4 = 'Use MYDB Grant Alter Any User To ' + @UserName + ' WITH GRANT OPTION'
Set @Str5 = 'USe MYDB Grant Alter Any Role To ' + @UserName + ' WITH GRANT OPTION'
/*--Execution Texts---------------------------------------------------------------*/
IF Not EXISTS (SELECT * FROM sys.server_principals WHERE name = @UserName)
Begin
Execute(@Str1)
IF Not EXISTS (SELECT * FROM sys.database_principals WHERE name = @UserName)
Begin
Execute(@Str3)
/*--Adding User On Database Role-----------------------------------*/
IF @UserType = 1
Begin
Execute('Exec Sp_AddRoleMember Manager ,' + @UserName)
Execute(@Str2)/*--Set Permission For Alter Any Login*/
Execute(@Str4)/*--Set Permission For Alter Any User*/
Execute(@Str5)/*--Set Permission For Alter Any Role*/
End
IF @UserType = 0
Execute('Exec Sp_AddRoleMember Operator,' + @UserName)
End
End
END
GO