none
Benutzer einer neuen Datenbank automatisch zuweisen RRS feed

  • Frage

  • Hallo an alle,

    ich möchte, wenn eine neue Datenbank erstellt wurde, einen Benutzer speziellen Benutzer dieser automatisch zuweisen. Dahinter steht eine Optimierung bzw. Automatisierung diverser Abläufe. 

    Hierzu habe ich ein Skript generiert, welches einen Parameter übergeben werden soll. Der Parameter steht für die neue Datenbank. 

    CREATE PROCEDURE usp_test2
    	 @name_db nvarchar(250)
    
    AS 
    
    										USE ['+ @name_db +'] 
                                            GO 
                                            CREATE USER [test] FOR LOGIN [test]; 
                                            GO 
                                            USE ['+ @name_db+ '] 
                                            GO 
                                            ALTER ROLE [db_datareader] ADD MEMBER [test] 
                                            GO
                                            USE ['+ @name_db +']  
                                            GO ALTER ROLE [db_datawriter] ADD MEMBER [test]
                                            GO

    Jedoch klappt der Wechsel der Datenbank sprich "GO" nicht. Wie kann man ein solches Problem lösen? Geht es überhaupt?

    Danke vorab!

    Samstag, 4. April 2020 16:05

Alle Antworten

  • Man kann/muss nicht immer alles scripten.
    Wenn du die neue DB erstellst, machst du dies ja unter einem bestimmten User (z.b. sa) oder auch einem Programm.
    Dann kannst du ebenso auch ein Programm schreiben, dass dann die Create/Grant-Befehle nach einem Connect direkt ausführt.
    Sonntag, 5. April 2020 12:00
  • Nein das geht leider nicht.

    Wenn es ein Serviceaccount ist, wird sich dieser nie offiziell Anmelden. 

    Es hat sich auch für mich so dargestellt das der Wechsel der Datenbank nicht möglich ist. Wenn ich es im Netz richtig verfolgt habe, scheint dies ein Sicherheitsfeature zu sein?! Kann das jemand bestätigen oder liege ich hier falsch?

    Ich kann stets nur die Rechte für jene Datenbank setzen die ich auch vorher "gewählt" habe. 

    Ein Use ...... scheint, wie schon geschrieben, nicht zu gehen! 

    	 declare @right_datawriter nvarchar(250); 
    
    	   set @change_DB = 'USE [TestDB3]'
    	   
    
    	   SET @right_set = 'CREATE USER [test] FOR LOGIN [test];' 
        
    		SET @right_datareader = 'ALTER ROLE [db_datareader] ADD MEMBER [test]' 
    		SET @right_datawriter ='ALTER ROLE [db_datawriter] ADD MEMBER [test]'
    
    		EXECUTE (@change_DB) 
    		EXECUTE (@right_set)
    		EXECUTE (@change_DB)
    		EXECUTE (@right_datareader)
    		EXECUTE (@change_DB)
    		EXECUTE (@right_datawriter)
    
    --Problem Datenbank schwenkt nicht!
    
    USE test5
    GO
    
         declare @change_DB nvarchar(250);
    	 declare @right_set nvarchar(250);
    	 declare @right_datareader nvarchar(250);
    	 declare @right_datawriter nvarchar(250);
    	 declare @db_name	nvarchar(250);
    	 declare @go	nvarchar(2);
    	 SET @go ='go'
    	 SET @db_name = 'test5'
    
    	   
    	   --set @change_DB = 'USE ['+ @db_name+']'
    	   set @change_DB = 'USE [test5]'
    	   EXECUTE (@change_DB) 
    	   --EXECUTE (@go)
    	   --select @change_DB
    
    	   SET @right_set = 'CREATE USER [test] FOR LOGIN [test];' 
        
    		SET @right_datareader = 'ALTER ROLE [db_datareader] ADD MEMBER [test]' 
    		SET @right_datawriter ='ALTER ROLE [db_datawriter] ADD MEMBER [test]'
    
    		EXECUTE (@change_DB) 
    		EXECUTE (@right_set)
    		EXECUTE (@change_DB)
    		EXECUTE (@right_datareader)
    		EXECUTE (@change_DB)
    		EXECUTE (@right_datawriter)
    

    Sonntag, 5. April 2020 20:53
  • Hallo!

    Packe den User doch mal in die Datenbank model. Dann sollte der automatisch mit in der neuen Datenbank angelegt werden.

    Model-Datenbank

    Alternativ müsstest Du dynamisches SQL verwenden.


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu


    Montag, 6. April 2020 05:53
    Beantworter
  • Hallo und danke Christoph, 

    ich habe mir zwar den Link durchgelesen kann mir aber noch nicht herleiten wenn ich meinen benutzer in die datenbank modell aufnehme, das dieser dann die von mir gewünschten Rechte erbt wenn eine neue datenbank angelegt werden soll.

    Noch mal kurz zur erinnerung: der benutzer soll datawriter und datareader auf jeder neuen datenbank sein wenn diese angelegt wird.

    Danke für deine Hilfe.

    Montag, 6. April 2020 19:02
  • Hallo!

    Die model-Datenbank ist eine Art Blaupause für jede neue Datenbank. Alles was Du dort anlegst, wird auch in jeder neuen Datenbank vorhanden sein.

    Also lege dort mal den User an und gib ihm die Berechtigungen in der model-DB.

    Danach legst Du eine neue Datenbank an und schaust einfach mal, ob der User jetzt auch dort mit den gleichen Berechtigungen wie in der model-DB vorhanden ist.


    Einen schönen Tag noch, Christoph - http://www.insidesql.org/blogs/cmu

    Dienstag, 7. April 2020 05:41
    Beantworter