none
[Sql2014] Flasche Einstellung der Set Option RRS feed

  • Frage

  • Hallo,

    ich habe folgende Gespeicherte Prozedur:

    CREATE PROCEDURE InstallUser
    	-- Add the parameters for the stored procedure here
    	@username varchar(255),
    	@password varchar(255),
    	@name varchar(255), 
    	@mail varchar(255),
    	@isSupervisor tinyint,
    	@userGroupCode varchar(255)
    AS
    BEGIN
    	if not exists (Select * From [User] where [Username] = @username) AND Len(@password) > 0 AND LEN(@username) > 0
    	BEGIN
    		declare @source varbinary(max);
    		declare @encoded varchar(255);
    
    		set @source = (Select HashBytes('MD5', @password));
    		set @encoded = cast('' as xml).value('xs:base64Binary(sql:variable("@source"))', 'varchar(max)');
    		Insert Into [User]([Username], [Password], [Name], [Mail], [IsSupervisor], [StorageDate], [StorageUser], [LastChange], [LastUser], [LastComputer]) VALUES(@username, @encoded, @name, @mail, @isSupervisor, getdate(), 'Install', getdate(), 'Install', '')
    		
    		if exists (Select * From [UserGroup] Where Code = @userGroupCode)
    		BEGIN
    			Insert Into [UserGroupAssignment]([UserID], [GroupID], [StorageDate], [StorageUser]) VALUES ((Select Top 1 ID From [User] Where [Username] = @username), (Select Top 1 ID From [UserGroup] Where [Code] = @userGroupCode), getdate(), 'Install')
    		END
    	END
    END
    GO

    Wenn ich diese separat einspiele ist alles in Ordnung. Wir führen hier jedoch im Nightly Build alle SQL Dateien, welche sich auf dem TFS und in dem Branch befinden in einer Datei zusammen und nutzen diese zum einspielen auf dem SQL Server.

    Ich erhalte beim einspielen des gesamten Skriptes folgenden Fehler:

    Meldung 1934, Ebene 16, Status 1, Prozedur InstallUser, Zeile 161935

    Fehler bei SELECT, da die folgenden SET-Optionen falsche Einstellungen aufweisen: 'ANSI_PADDING'. Überprüfen Sie, ob die SET-Optionen für die Verwendung mit indizierte Sichten und/oder Indizes für berechnete Spalten und/oder gefilterte Indizes und/oder Abfragebenachrichtigungen und/oder XML-Datentypmethoden und/oder Vorgänge für räumliche Indizes richtig sind.


    Diese Option wieder aber in dem komplett Skript nirgends gesetzt.

    Ich weiß allmählich nicht mehr weiter. Wenn Ich den Teil mit MD5 und base64 Konvertierung aus der Prozedur rausnehme klappt alles Einwandfrei. Hat jemand eine Idee?

    Beste Grüße

    Q-Tec


    Dev86 Technical Blog

    Donnerstag, 13. Oktober 2016 13:55

Antworten

  • Fehler bei SELECT, da die folgenden SET-Optionen falsche Einstellungen aufweisen: 'ANSI_PADDING'. ....
    Diese Option wieder aber in dem komplett Skript nirgends gesetzt.

    Hallo,

    die Einstellung ist auf Projektebene und in den Projekteinstellungen unter dem Button "Datenbankeinstellungen" zu finden; prüfe mal, ob das das Häkchen gesetzt ist.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 13. Oktober 2016 14:27
  • Hallo Q-Tec,

    SET ANSI_PADDING sollte bei der Tabellenanlage/-änderung auf ON gestellt sein, sonst gibt es später Probleme (wie die obige Fehlermeldung).  Üblicherweise wird dies bereits vom Treiber (Sql Client, Ole DB, ODBC) richtig gesetzt, ausgenommen man ändert dort die Einstellungen.

    Sollte es Tabellenspalten geben, die bereits mit OFF angelegt sind, so empfiehlt es sich dies zu ändern (und ggf. Skripte, die das Problem verursachen). In sys.columns gibt die Spalte is_ansi_padded darüber Auskunft.

    Schau Dir die Anmerkungen zu SET Anweisungen an, da gibt es ggf. weitere Einstellungen die überprüft werden müssen. Man sollte heute nur noch die Einstellungen verwenden, die auch für indizierte Sichten notwendig sind - unabhängig davon, ob man sie nutzt, denn alle anderen werden langfristig entfallen.

    Unabhängig davon: MD5 sollte man nicht mehr für Kennwort Hashes verwenden, nimm besser SHA2_256 oder SHA2_512. Und ein Salt wäre auch nicht schlecht.

    Gruß Elmar

    @Olaf: Die Server-/Datenbank-Einstellungen kommen normalerweise nie zum Tragen, da die Treiber die Werte einstellen. "Richtig" sollten sie jedoch sein.

    Donnerstag, 13. Oktober 2016 15:10
    Beantworter

Alle Antworten

  • Fehler bei SELECT, da die folgenden SET-Optionen falsche Einstellungen aufweisen: 'ANSI_PADDING'. ....
    Diese Option wieder aber in dem komplett Skript nirgends gesetzt.

    Hallo,

    die Einstellung ist auf Projektebene und in den Projekteinstellungen unter dem Button "Datenbankeinstellungen" zu finden; prüfe mal, ob das das Häkchen gesetzt ist.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Donnerstag, 13. Oktober 2016 14:27
  • Hallo Q-Tec,

    SET ANSI_PADDING sollte bei der Tabellenanlage/-änderung auf ON gestellt sein, sonst gibt es später Probleme (wie die obige Fehlermeldung).  Üblicherweise wird dies bereits vom Treiber (Sql Client, Ole DB, ODBC) richtig gesetzt, ausgenommen man ändert dort die Einstellungen.

    Sollte es Tabellenspalten geben, die bereits mit OFF angelegt sind, so empfiehlt es sich dies zu ändern (und ggf. Skripte, die das Problem verursachen). In sys.columns gibt die Spalte is_ansi_padded darüber Auskunft.

    Schau Dir die Anmerkungen zu SET Anweisungen an, da gibt es ggf. weitere Einstellungen die überprüft werden müssen. Man sollte heute nur noch die Einstellungen verwenden, die auch für indizierte Sichten notwendig sind - unabhängig davon, ob man sie nutzt, denn alle anderen werden langfristig entfallen.

    Unabhängig davon: MD5 sollte man nicht mehr für Kennwort Hashes verwenden, nimm besser SHA2_256 oder SHA2_512. Und ein Salt wäre auch nicht schlecht.

    Gruß Elmar

    @Olaf: Die Server-/Datenbank-Einstellungen kommen normalerweise nie zum Tragen, da die Treiber die Werte einstellen. "Richtig" sollten sie jedoch sein.

    Donnerstag, 13. Oktober 2016 15:10
    Beantworter