Announcement

Collapse
No announcement yet.

Use mit Variablen benutzen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Use mit Variablen benutzen

    Hallo zusammen,
    ich lasse mir alle DB`s ausgeben... diese schreibe ich in eine Variable..
    ..ich möchte dann den Focus auf die jeweilige DB setzten. Meine überlegung war folgende:

    Code:
    DECLARE @DBName NVARCHAR(200)
    DECLARE @sqlUse NVARCHAR(300)
    SET @DBName = '[MyDb]'-- dies nur als Beispiel für eine DB
    PRINT @DBName
    --set @sqlUse = 'use ' + @DBName
    SET @sqlUse = N'use ' + @DBName 
    
    PRINT @sqlUse
    EXEC sp_sqlexec @sqlUse
    Der Focus wird aber nicht auf diese Datenbank gesetzt. Hat jemand eine bessere Idee oder habe ich nur einen Fehler in der Syntax...?
    Danke für jeden Tipp

  • #2
    Vielleicht lässt sich das Beispiel von http://www.kronester.com/?p=824 (sys.sp_MSforeachdb) hier verwenden...
    MfG
    Cheat-Sheets for Developers / Programming Quotes

    Comment


    • #3
      Danke für deine Antwort..
      ..aber das ist für mich son nicht zu gebrauchen...

      Comment


      • #4
        EXEC sp_sqlexec @sqlUse
        Hallo,

        so kann es nicht funktionieren, das Statement wird in einem eigenen Task ausgeführt; dort wird dann zwar dann auf die gewünschte DB gewechselt, nur endet dann der Task und Dein restliches Statement bleibt im gleichen Kontext.

        Wenn, dann müsstest Du das restliche Statement mit ins dynamische SQL Statement mit aufnehmen.

        Was genau willst Du machen?
        Olaf Helper

        <Blog> <Xing>
        * cogito ergo sum * errare humanum est * quote erat demonstrandum *
        Wenn ich denke, ist das ein Fehler und das beweise ich täglich

        Comment


        • #5
          Hallo O. Helper,
          ich möchte User Klonen. Das heißt ich möchte einen User mit den entsprechenden Rechten und Rollen kopieren und unter einem anderen Namen speichern. Oder einen User umbenenen ( Namensänderung bei Heirat ).

          Ich bin da auch schon ganz schön weit. Dazu muss ich mich in einem Curser aber immer auf die Aktuelle Datenbank linken ( die DB benötigt den Focus ).
          Hier mein Ansatz...

          Code:
          ALTER Procedure [dbo].[StP_CloneUser1]
          @ExistingUser NVARCHAR(128), --User, welche geklont werden soll
          @CloneUser    NVARCHAR(128), --Neuer Username
          @PWDNew NVARCHAR(128),          --Wenn Kennwort gleich dem alten User sein soll
          							 --Wenn Neuer User ein anderes Kennwort bekommen soll muss das hier eingetragen werden
          @KillExistingUser BIT		 --1 Wenn der Alte User nach dem Klonen gelöscht werden soll 
          							 --0 Wenn der Alte User behalten werden soll
          							  
          as
          DECLARE @Msg  NVARCHAR(200)
          DECLARE @PWD NVARCHAR(128)
          DECLARE @DefDB NVARCHAR(128)
          DECLARE @defLang NVARCHAR(128)
          DECLARE @MyError INT
          SET @MyError = 0
          
          BEGIN
          	IF RTrim(LTrim(@ExistingUser))= RTrim(LTrim(@CloneUser))
          		BEGIN
          		SET @Msg ='Alter und neuer Benutzer dürfen nicht gleich sein...'
          			RAISERROR ( @Msg,16,1)
          			RETURN
          		END
          END
          
          begin
          	IF not EXISTS (SELECT * FROM master.dbo.syslogins WHERE name = N'' + @ExistingUser + '')
          		begin
          			SET @Msg ='Der Benutzer ( alt ) ''' + @ExistingUser + ''' ist nicht vorhanden...'
          			RAISERROR ( @Msg,16,1)
          			RETURN
          		end
          	IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE name = N'' + @CloneUser + '')
          		begin
          			SET @Msg ='Der Benutzer ( neu ) ''' + @CloneUser + ''' ist schon vorhanden...'
          			RAISERROR ( @Msg,16,1)
          			RETURN
          		end  
          end
          
          DECLARE @DBName nvarchar(128)
          DECLARE @RoleName nvarchar(128)
          DECLARE @ChangePWD as bit
          SET @ChangePWD = 0
          declare User_Cursor Cursor For
          SELECT [dbname] as DefDB, [password] as PWD, [language] as defLang FROM dbo.syslogins Where Name = @ExistingUser
          	open User_Cursor;
          	FETCH NEXT FROM User_Cursor
          		into @DefDB, @PWD, @defLang;
          		if Not @PWDNew is Null or not @PWDNew =''
          			BEGIN
          				SET @PWD =@PWDNew
          				SET @ChangePWD = 1
          			END		
          
          		while @@fetch_status=0
          			begin
          				If @ChangePWD = 0
          					BEGIN							
          						EXEC master.dbo.sp_addlogin @CloneUser, @PWD, @DefDB, @defLang, Null, N'skip_encryption'
          					END
          				ELSE
          					BEGIN							
          						EXEC master.dbo.sp_addlogin @CloneUser, @PWD, @DefDB, @defLang, Null, NULL
          					END
          					
          				print 'Der Benutzer ' + @CloneUser + ' wurde angelegt...'
          				FETCH NEXT FROM User_Cursor
          				into @DefDB, @PWD, @defLang;
          			END
          		CLOSE User_Cursor;
          		DEALLOCATE User_Cursor;
          
          
          DECLARE @SQLUse nvarchar(4000)				
          DECLARE DBName_Cursor CURSOR FOR
          --SELECT dtb.name AS [DBName], dtb.dbid  FROM master.dbo.sysdatabases AS dtb ORDER BY [DBName] ASC;
          SELECT dtb.name AS [DBName] FROM master.dbo.sysdatabases AS dtb ORDER BY [DBName] ASC;
          OPEN DBName_Cursor;
          	-- Perform the first fetch and store the values in variables.
          	-- Note: The variables are in the same order as the columns
          	-- in the SELECT statement. 
          	FETCH NEXT FROM DBName_Cursor
          		INTO @DBName
          		--, @DBID; 
          		-- Check @@FETCH_STATUS to see if there are any more rows to fetch.
          		WHILE @@FETCH_STATUS = 0
          			BEGIN
          			   -- Concatenate and display the current values in the variables.
          			   -- This is executed as long as the previous fetch succeeds.
          			   set @sqlUse = N'use ' + @DBName + ' exec sp_helpfile'
          			   --Set @SQLUse = 'use ' + db_name(@DBID)
          			   --SET @SQLUse = @SQLUse +  ' SELECT rl.name AS [RoleName] FROM dbo.sysusers AS rl WHERE (rl.issqlrole = 1) and rl.uid <> 0 and rl.uid >= 16400 ORDER BY [Name] ASC'			
          			   --exec sp_executesql @SQLUse
          			   PRINT @DBName
          			   print @SQLUse
          			   exec (@SQLUse)
          			   --SET @SQLUse = N'SELECT r.name AS [RoleName]	FROM  [' + @DBName + '].dbo.sysusers AS u INNER JOIN [' + @DBName + ']dbo.sysmembers AS m ON u.uid = m.memberuid INNER JOIN [' + @DBName + ']dbo.sysusers AS r ON m.groupuid = r.uid WHERE (u.name = ''' + @ExistingUser + ''')'
          			   --print @SQLUse
          			   
          			   DECLARE Role_Cursor Cursor FOR
          			   --exec sp_helprole
          			  -- select 'RoleName' = name from sysusers where issqlrole = 1 or isapprole = 1
          
          			   --SELECT rl.name AS [RoleName] FROM dbo.sysusers AS rl WHERE (rl.issqlrole = 1) and rl.uid <> 0 and rl.uid >= 16400 ORDER BY [Name] ASC
          			   SELECT r.name AS [RoleName]	FROM  dbo.sysusers AS u INNER JOIN dbo.sysmembers AS m ON u.uid = m.memberuid INNER JOIN dbo.sysusers AS r ON m.groupuid = r.uid WHERE (u.name = '' + @ExistingUser + '')
          			   open Role_Cursor;
          					FETCH NEXT FROM Role_Cursor
          						into @RoleName;
          						print @RoleName
          						while @@fetch_status=0
          							begin							
          								print @RoleName
          								IF IS_MEMBER ( @RoleName ) = 1
          								Begin
          									exec sp_helpuser @CloneUser
          									if @@ERROR <> 0
          									BEGIN	
          										EXEC sp_adduser @CloneUser, @CloneUser, @RoleName
          										print @CloneUser + ' ist in Datenbank ' + @DBName + ' - Rolle ' +  @RoleName + ' angelegt.. '
          										IF @KillExistingUser  = convert(bit,1)
          										BEGIN						
          											EXEC sp_droprolemember  @RoleName ,  @ExistingUser 
          											Print N'Benutzer ' + @ExistingUser + N' wurde aus Rolle ' + @RoleName + ' in Datenbank [' + @DBName + N'] gelöscht !'
          										END
          									END
          										BEGIN
          											EXEC sp_addrolemember  @RoleName  ,   @CloneUser 
          											Print N'In Datenbank [' + @DBName + N'] Rolle ' + @RoleName + ' wurde User ' + @CloneUser + N' hinzugefügt !'
          											IF @KillExistingUser  = convert(bit,1)
          											BEGIN
          												EXEC sp_droprolemember @RoleName ,@ExistingUser
          												Print N'Benutzer ' + @ExistingUser + N' wurde aus Rolle ' + @RoleName + ' in Datenbank [' + @DBName + N'] gelöscht !'
          												IF (SELECT COUNT(*) AS MyCount FROM dbo.sysusers AS u INNER JOIN dbo.sysmembers AS m ON u.uid = m.memberuid INNER JOIN dbo.sysusers AS r ON m.groupuid = r.uid WHERE (u.name =  @ExistingUser ))= 0
          												BEGIN
          													EXEC sp_dropuser @ExistingUser
          													Print N'Benutzer ' + @ExistingUser + N' wurde aus Datenbank ' + @DBName + N' gelöscht !'
          												END					
          											END
          										END
          									END
          								END
          					FETCH NEXT FROM Role_Cursor
          					INTO @RoleName;
          					--END
          				CLOSE Role_Cursor;
          				DEALLOCATE Role_Cursor;						 			   
          			END
          	FETCH NEXT FROM DBName_Cursor
          	INTO @DBName
          	--, @DBID;
          CLOSE DBName_Cursor;
          DEALLOCATE DBName_Cursor;
          
          --IF @MyError <> 0
          --	Begin
          --		IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE name = N'' + @CloneUser + '')
          --		BEGIN
          --			EXEC master.dbo.sp_droplogin @CloneUser
          --			Print N'Benutzer ' + @CloneUser + N' wurde vom SQL-Server gelöscht !'
          --		END  
          --		SET @Msg ='Die Procedur ist mit Fehlern durchlaufen!! Bitte User und Rollen Prüfen!! Rollback wurde durchgeführt!!'
          --		RAISERROR ( @Msg,16,1)
          --		RETURN
          --	End
          	
          	--print @KillExistingUser
          IF @KillExistingUser = 1
          	Begin
          		IF EXISTS (SELECT * FROM master.dbo.syslogins WHERE name = N'' + @ExistingUser + '')
          		BEGIN
          			EXEC master.dbo.sp_droplogin @ExistingUser
          			Print N'Benutzer ' + @ExistingUser + N' wurde vom SQL-Server gelöscht !'
          		END
          	end
          Ich hoffe du hast ne Idee wie ich das hinbekomme...
          Vielleicht hast du auch ne Idee wie ich ein Rollback bei Fehler hinbekomme...
          Schon mal Danke
          Zuletzt editiert von M Merlin; 30.10.2010, 19:47. Reason: Fehler im Code entdeckt und geändert

          Comment

          Working...
          X