2017-04-02 6 views
0

Ich versuche liquibase zu verwenden Mitglieder zu einer Rolle hinzufügen, aber die SQL unterscheidet sich von SQL Server 2008 bis 2012Run verschiedene Skripte liquibase basierend auf SQL Server Version

SQL Server 2008:

exec sp_addrolemember db_datareader, MYUSER 

SQL Server:

ALTER ROLE db_datawriter ADD MEMBER MYUSER 

Die folgende SQL, wenn sie über liquibase gegen SQL Server 2012 funktioniert ordnungsgemäß ausgeführt, aber wenn sie gegen SQL Server 2008 lief es nicht und sagt:

falsche Syntax nahe dem Schlüsselwort 'ADD'

Code:

DECLARE @ver nvarchar(50), 
     @intVer int, 
     @ver2008 int = 10 

SET @ver = CAST(serverproperty('ProductVersion') AS nvarchar) 
SET @intVer = CAST(SUBSTRING(@ver, 1, CHARINDEX('.', @ver) - 1) AS int) 

IF (@intVer = @ver2008) 
    exec sp_addrolemember db_datawriter, MYUSER 
ELSE 
    ALTER ROLE db_datawriter ADD MEMBER MYUSER; 

Ich habe versucht, die Versionen zu trennen, SQL Server 2008 in einer Datei und 2012 in ein anderes setzen und mit einem ' Vorbedingung 'am Anfang des Changelogs (außerhalb eines Änderungssatzes). Aber es gibt nur 2 OnFail-Optionen, HALT, die das gesamte Update stoppen, oder WARN, das nur das Skript fortsetzt, die beide mir nicht geben, was ich brauche.

Ich muss in der Lage sein für das Skript herauszufinden, welche Version von SQL Server es arbeitet und nur dieses bestimmte Liquibase-Skript, ob es ein Changeset oder Changelog sein.

Antwort

1

Die Kompilierung des gesamten Stapels schlägt fehl, wenn die Syntax nicht erkannt wird. Sie können das Problem umgehen, indem Sie die Anweisungen in EXECUTE umbrechen oder sp_executesql verwenden.

IF (@intVer = @ver2008) 
    EXECUTE(N'exec sp_addrolemember db_datawriter, MYUSER;') 
ELSE 
    EXECUTE(N'ALTER ROLE db_datawriter ADD MEMBER MYUSER;'); 
+0

Dies funktioniert, aber ich hatte gehofft, ich hätte nicht die gleiche Logik, um die Version in jedem Änderungssatz zu erhalten, wo ich ein Mitglied zu einer Rolle hinzufügen. – Aaron

Verwandte Themen