Jump to content

McKloony

Members
  • Gesamte Inhalte

    35
  • Registriert seit

  • Letzter Besuch

Beiträge erstellt von McKloony

  1. Ich versuche ein View auf eine Tabelle zu erstellen, die mehrere Felder enthält, die aber nicht immer einen Wert enthalten. Der Inhalt einiger Felder ist dann NULL. Hier ein Beispiel:

     

    Feld1   Feld2   Feld3   Feld4

    Wert  Null     Wert      Wert

    Null   Null     Wert      Null

    Wert  Wert    Null      Wert

     

    Mein Ziel die Werte aller Felder in einem neuen Feld des Views ausgeben zu lassen.

     

    Feld1 + ' ' + Feld + ' ' + Feld3 + ' ' + Feld4 As Neufeld

     

    funktioniert leider nur insoweit, dass nur dann etwas angezeigt wird, wenn alle vier Felder einen Wert enthlaten.

     

    CASE WHEN Feld1 IS NOT NULL THEN Feld1 + ' ' + CASE WHEN Feld2 IS NOT NULL THEN Feld2  + ' ' + CASE WHEN Feld3 IS NOT NULL THEN Feld3 

     

    Funktioniert auch nur dann, wenn alle Felder einen Wert enthalten. Weiß jemand eine Lösung?

     

  2. Ich habe mich mit sa als sysadmin im SQL Server angemeldet und einfach den Server Login für den dort vorhandenen Windows Admin User entfernt. Jetzt sollte es eigentlich nur noch möglich sein, sich mit sa anzumelden, wenn man sysadmin Rechte haben möchte.

     

    Allerdings ist es für einen echten Windows Admin möglich, über das Commandfenster und der Anweisung "sqlservr.exe -m" den SQL Server im administrativen Modus zu starten und sich dann insgeheim ein neues Login mit allen Rollen zu erstellen, aber das werde ich auch noch irgendwie absichern.

     

    Das Beste wäre natürlich, dass man im Active Directory einen Windows Admin anlegen könnte, dem die Möglichkeiten fehlen, selber weitere Windows User anzulegen. Dann könnte man diesem Admin versuchen die Rollen zu entziehen, auf den SQL Server zuzugreifen.

  3. Bei einem SQL 2012 habe ich ein Script geschrieben, welches einer Datenbank einen Admin User und einen Standard User hinzufügt. Dem Admin User werden alle Rollen entzogen, die ihm ermöglichen, eine SELECT Anweisung auf Datensätze auszuführen. Er soll diese ja nicht sehen, sondern nur arbeiten am Sever und der Struktur der Datenbank durchführen. Der Standard User soll dagegen mit den Daten arbeiten können, also Lesen und Schreiben aber selber keine administrativen Änderungen durchführen können.

    USER MASTER
    GO
    
    
    DROP PROCEDURE USP_CREATE_LOGIN_STANDARD
    GO
    
    
    DROP PROCEDURE USP_CREATE_LOGIN_ADMIN
    GO
    
    
    
    CREATE PROCEDURE USP_CREATE_LOGIN_STANDARD (
    	@DefaultDatabase nvarchar(50),
    	@LoginName nvarchar(50),
    	@LoginPassword nvarchar(50),
    	@DefaultSchema nvarchar(50),
    	@User nvarchar(50)) AS
    BEGIN
    	SET NOCOUNT ON
    
    	DECLARE @SQL nvarchar(max)
    
    	SET @SQL =  
    		'IF NOT EXISTS (SELECT name FROM sys.syslogins WHERE name = ''' + @LoginName + ''')' +
    		'BEGIN ' +
    			'USE master; ' + 
    			'CREATE LOGIN ' + @LoginName + ' WITH PASSWORD = ''' + @LoginPassword + ''', DEFAULT_DATABASE = ' + @DefaultDatabase + ', CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF; ' +
    			'PRINT(''New login ''''' + @LoginName + ''''' has been successfully created.'')' +
    		'END ' +
    		'ELSE ' +
    		'BEGIN ' +
    			'PRINT(''Login ''''' + @LoginName + ''''' already exists!!!'')' +
    		'END'
    
    	EXECUTE (@SQL)
    
    	SET @SQL =  
    		'USE ' + @DefaultDatabase + '; ' + 
    		'IF NOT EXISTS (SELECT name FROM sys.sysusers WHERE name = ''' + @User + ''')' +
    		'BEGIN ' +			
    			'CREATE USER ' + @User + ' FOR LOGIN ' + @LoginName + '; ' +	
    			'PRINT(''New user ''''' + @User + ''''' has been successfully created.'')' +
    		'END ' + 		
    		'ALTER USER ' + @User + ' WITH DEFAULT_SCHEMA = ' + @DefaultSchema + '; ' +
    		
    		'EXEC sp_droprolemember  ''db_accessadmin'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_backupoperator'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_datareader'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_datawriter'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_ddladmin'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_denydatareader'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_denydatawriter'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_owner'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_securityadmin'', ' + @User + '; ' +
    
    		'EXEC sp_addrolemember  ''db_owner'', ' + @User + '; ' +
    		'EXEC sp_addrolemember  ''db_datareader'', ' + @User + '; ' +
    		'EXEC sp_addrolemember  ''db_datawriter'', ' + @User + '; ' +
    
    		'PRINT(''Privileges for user ''''' + @User + ''''' altered!!!'')' 
    	
    	EXECUTE (@SQL)
    END
    GO
    
    
    
    CREATE PROCEDURE USP_CREATE_LOGIN_ADMIN (
    	@DefaultDatabase nvarchar(50), 
    	@LoginName nvarchar(50), 
    	@LoginPassword nvarchar(50),
    	@DefaultSchema nvarchar(50),
    	@User nvarchar(50)) AS
    BEGIN
    	SET NOCOUNT ON;
     
    	DECLARE @SQL nvarchar(max)
    
    	SET @SQL =  
    		'IF NOT EXISTS (SELECT name FROM sys.syslogins WHERE name = ''' + @LoginName + ''')' +
    		'BEGIN ' +
    			'USE master; ' + 
    			'CREATE LOGIN ' + @LoginName + ' WITH PASSWORD = ''' + @LoginPassword + ''', DEFAULT_DATABASE = ' + @DefaultDatabase + ', CHECK_EXPIRATION = OFF, CHECK_POLICY = OFF; ' +
    			'PRINT(''New login ''''' + @LoginName + ''''' has been successfully created.'')' +
    		'END ' +
    		'ELSE ' +
    		'BEGIN ' +
    			'PRINT(''Login ''''' + @LoginName + ''''' already exists!!!'')' +
    		'END'
    
    	EXECUTE (@SQL)
    
    	SET @SQL = 
    		'USE ' + @DefaultDatabase + '; ' + 
    		'IF NOT EXISTS (SELECT name FROM sys.sysusers WHERE name = ''' + @User + ''')' +
    		'BEGIN ' +			
    			'CREATE USER ' + @User + ' FOR LOGIN ' + @LoginName + '; ' +		
    			'PRINT(''New user ''''' + @User + ''''' has been successfully created.'')' +	
    		'END ' + 
    		'ALTER USER ' + @User + ' WITH DEFAULT_SCHEMA = ' + @DefaultSchema + '; ' +			
    
    		'EXEC sp_droprolemember  ''db_accessadmin'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_backupoperator'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_datareader'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_datawriter'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_ddladmin'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_denydatareader'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_denydatawriter'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_owner'', ' + @User + '; ' +
    		'EXEC sp_droprolemember  ''db_securityadmin'', ' + @User + '; ' +
    		'EXEC sp_addrolemember  ''db_backupoperator'', ' + @User + '; ' +
    		'EXEC sp_addrolemember  ''db_ddladmin'', ' + @User + '; ' +
    		
    		'PRINT(''Privileges for user ''''' + @User + ''''' altered!!!'')' 
    
    	EXECUTE (@SQL)
    END
    GO
    
    
    
    
    EXECUTE USP_CREATE_LOGIN_STANDARD 
    	@DefaultDatabase = 'Dummy',
    	@LoginName = 'login_standard',
    	@LoginPassword = 'login_standard',
    	@DefaultSchema = 'dbo',
    	@User = 'login_standard_user'
    
    
    EXECUTE USP_CREATE_LOGIN_ADMIN 
    	@DefaultDatabase = 'Dummy',
    	@LoginName = 'login_admin',
    	@LoginPassword = 'login_admin',
    	@DefaultSchema = 'dbo',
    	@User = 'login_admin_user'
    	
    	
    

    Jetzt habe ich aber das Problem, dass sich ein Admin immer noch mit Windows Authentifizierung anmelden kann und somit wieder Zugriff auf die Daten hat, sprich eine SELECT Anweisung ausführen kann. Welche Rollen muss man dem Active Directory Admin entziehen, damit das nicht mehr möglich ist? Es bringt ja auch nichts, beim SQL Server einen Login für den AD Admin zu generieren und ihm die Rechte dort zu entziehen. Der AD Admin kann ja wiederum einen weiteren AD Admin anlegen, für den im SQL Server kein Login existiert und hat somit wieder Zugriff. Ich finde eine Sicherheitslücke im SQL Server.

     

  4. Ich möchte bei einem SQL Server 2008 R2 beziehungsweise SQL Server 2012 Express einen neuen Login erstellen. Dieser Login soll in der Lage ein, neue SQL Server Datenbank anzulegen, zu löschen, Logins für eine Datenbank zu erstellen, Datensätze anzufügen ABER nicht den Inhalt einer Tabelle lesen zu können. Es darf also nicht möglich sein, eine SELECT Anweisung auszuführen. Ziel soll sein, dass es einen Datenbank Admin gibt, der so ziemlich alles machen darf, aber eben nicht die Datensätze selber sehen, exportieren oder drucken darf. Ist so etwas über die standardisierten Serverrollen möglich oder nur, wenn man beim SQL Server 2012 Enterprise eine eigene Serverrolle anleget?

  5. Der Rest ist leider nicht selbsterklärend, sonst hätte ich nicht angefragt. Ich bin der Meiningen, dass es für diese Routineaufgaben auch schon ein fertiges Script geben könnte. Software wie dbcomparer usw. nutze ich selbstverständlich auch, diese kann man aber selbstverständlich nicht an Dritte weitergeben, ein Script eben schon. Trotzdem vielen Dank.

  6. Mit SQLCMD führe ich eine vorgefertigtes Script aus:

    SQLCMD -S ".\SQLEXPRESS" -E -i "c:\Backup\SQL_Create.sql" -o "c:\Backup\SQL_Create.txt"
    

    Dieses wird anstandslos ausgeführt und es wird auch die Datei SQL_Create.txt Datei erzeugt. Leider schließt sich danach das CDM Fenster nicht automatisch, man kann also nicht sehen, ob der Befehl ausgeführt wurde. Kennt jemand das Problem und eine Lösung?

  7. Stimmt geht auch alles in einer Zeile:

    SQLCMD -S ".\MOND" -E -Q "DROP DATABASE [Dummy]"
    
    SQLCMD -S ".\MOND" -E -Q "CREATE DATABASE [Dummy] ON (NAME = Dummy, FILENAME = 'c:\SQLDatenbank\Dummy.mdf', SIZE = 10, MAXSIZE = 500, FILEGROWTH = 5) LOG ON (NAME = Dummy_log, FILENAME = 'c:\SQLDatenbank\Dummy_Log.ldf', SIZE = 100MB, MAXSIZE = 5000MB, FILEGROWTH = 5MB)"
    
    

    Ich finde das etwas simpler als Powershell.

  8. Ich würde gerne mit SQLCMD eine neue Datenbank anlegen. Dazu kann man ja zum Beispiel folgenden Befehl absetzen:

     

    SQLCMD -S ".\SQLEXPRESS" -E -Q "CREATE DATABASE [Dummy]"

     

    Ich würde aber auch noch gerne ein paar weitere Parameter übergeben, nämlich:

    CREATE DATABASE Dummy
    ON 
    ( NAME = Dummy,
        FILENAME = 'c:\SQLDatenbank\Dummy.mdf',
        SIZE = 10,
        MAXSIZE = 500,
        FILEGROWTH = 5 )
    LOG ON
    ( NAME = Dummy_log,
        FILENAME = 'c:\SQLDatenbank\Dummy_Log.ldf',
        SIZE = 100MB,
        MAXSIZE = 5000MB,
        FILEGROWTH = 5MB ) ;
    GO
    

    Ich möchte dabei nicht das SQL Script auf die Festplatte abspeichern und dann per SQLCMD aufrüfen müssen. Gibt es da irgendeine Möglichkeit?

     

  9. Ich versuche eine Abfrage zu erstellen, die mir den letzten Datensatz aus einer Tabelle liefert. Dabei stoße ich auf zwei Probleme:

     

    1. Das Datenfeld, nach dem sortiert werden soll hat den Typ: nVarChar(). Darin sind aber nur numerische Werte gespeichert. Um korrekt nach dem Inhalt dieses Feldes zu sortieren muss ich irgend eine Format oder CAST Anweisung in die ORDER BY Klausel einbauen, waiß aber nicht wie.

     

    2. Es werden immer nur max 10.000 Datensätze zurückgegeben

     

    Hat jemand eine Lösung?

  10. Wenn ich dieses Script so ausführe, kommen die folgenden Fehlermeldungen:

     

     

     

    Meldung 5133, Ebene 16, Status 1, Zeile 9
    Fehler bei der Verzeichnissuche für die Datei 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MOND\MSSQL\DATA\Dummy.mdf'. Betriebssystemfehler 3(Das System kann den angegebenen Pfad nicht finden.).
    Meldung 3156, Ebene 16, Status 3, Zeile 9
    Die Datei 'Dummy' kann nicht in 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MOND\MSSQL\DATA\Dummy.mdf' wiederhergestellt werden. Verwenden Sie WITH MOVE, um einen gültigen Speicherort für die Datei zu identifizieren.
    Meldung 5133, Ebene 16, Status 1, Zeile 9
    Fehler bei der Verzeichnissuche für die Datei 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MOND\MSSQL\DATA\Dummy_log.ldf'. Betriebssystemfehler 3(Das System kann den angegebenen Pfad nicht finden.).
    Meldung 3156, Ebene 16, Status 3, Zeile 9
    Die Datei 'Dummy_log' kann nicht in 'c:\Program Files\Microsoft SQL Server\MSSQL10_50.MOND\MSSQL\DATA\Dummy_log.ldf' wiederhergestellt werden. Verwenden Sie WITH MOVE, um einen gültigen Speicherort für die Datei zu identifizieren.
    Meldung 3119, Ebene 16, Status 1, Zeile 9
    Beim Planen der RESTORE-Anweisung wurden Probleme gefunden. Vorausgehende Meldungen enthalten ausführliche Informationen.
    Meldung 3013, Ebene 16, Status 1, Zeile 9
    RESTORE DATABASE wird fehlerbedingt beendet.
  11. Für mich klingt das nicht logisch und ich weiß nicht wo ich einerseits die testDB entfernen und andererseits  die testDB wiederherstellen soll. Kannst Du das folgende SQL Script nicht einfach so anpassen, dass "Dummy.mdf" und "Dummy_log.ldf"  nicht mehr benötigt werden?

     

    USE [master]
    RESTORE DATABASE [TestDB] FROM  DISK = N'D:\TestDB.bak' WITH  FILE = 1,  MOVE N'Dummy' TO N'd:\SQLDatenbank\Dummy.mdf',  MOVE N'Dummy_log' TO N'd:\SQLDatenbank\Dummy_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 5
    GO
    

    Dieses Script funktioniert zwar, aber auch deshalb, weil ich weiß, dass die Datenbank im Sicherungssatz Dummy heißt. Wenn ich Dummy entferne und durch "" ersetze funktioniert es nicht mehr.

  12. Da kommt dasselbe Script bei raus:

     

    USE [master]
    RESTORE DATABASE [TestDB] FROM  DISK = N'D:\TestDB_Backup.bak' WITH  FILE = 1,  MOVE N'TestDB' TO N'd:\SQLDatenbank\TestDB.mdf',  MOVE N'TestDB_log' TO N'd:\SQLDatenbank\TestDB_log.ldf',  NOUNLOAD,  REPLACE,  STATS = 5
    GO
    

    Ohne dass man weiß, dass die OriginalDatenbank "Dummy" bzw. "Dummy_Log" heiß, kann das Script niemals erfolgreich ausgeführt werden. Beim SQL Server 2008 war das anders, der hat diese Information nicht abgefragt.

×
×
  • Neu erstellen...