Erstellen Sie ein Benutzer-Skript mit variablen Domain-Benutzer-Login

Wir haben einen DACPAC, der ein Benutzer-Skript erstellt hat. Der Benutzer hat eine Anmeldung, die auf einen Windows-Domänenbenutzer gesetzt werden muss. Wenn wir einen Build für Test / Staging / Release machen, müssen wir in der Lage sein, eine andere Domain und Benutzer für die Benutzer anzumelden.

Ich dachte, wir könnten SQLCMD-variables verwenden, aber ich bekomme nur einen SQL71501 Fehler beim Versuch, das zu verwenden Das Skript sieht so aus:

CREATE USER [Username] For Login [$(SQLLoginDomain)] WITH DEFAULT_SCHEMA = [SCHEMANAME] GO 

Mein Rat basiert auf bitterer Erfahrung ist, alles zu halten, was umweltbezogen ist aus Ihrem SQL server databaseprojekt heraus. Stattdessen wenden Sie etwas an, das umweltbezogen ist (permisins usw.) als separates T-SQL-Skript, nachdem das DACPAC bereitgestellt wurde. Wenn Sie dies mit Release Management tun, habe ich eine Suppe-to-Nuts-Blog-Serie, die das Veröffentlichen von DACPACs und separaten Berechtigungs-Skripts enthält. Die Post über die Anwendung eines Token-Berechtigungs-Skripts ist hier .

Wir haben das Problem getriggers, indem wir ein Post-Deployment-Skript im Dacpac verwenden und solange du einen Scheck machst, bevor du versuchst, den Benutzer anzurufen, um zu sehen, ob sie bereits existieren, das alles funktioniert, als das ist der einzige Ort, an dem du sie benutzen kannst Bereitstellungsskript.

Sie können die Windows-Domäne aus der Systemansicht von sys.dm_exec_sessions lesen.

Zum Beispiel könntest du so etwas im DACPAC-Post-Deployment-Skript setzen …

 DECLARE @host_name nvarchar(128); DECLARE @nt_domain nvarchar(128); SELECT @host_name = host_name, @nt_domain = nt_domain FROM sys.dm_exec_sessions WHERE session_id = @@SPID; -- If the domain is present, setup the login/user. -- Otherwise, we are probably running under test environment, so we can skip this. -- `@nt_domain = @host_name` tends to hold for LocalDB. IF @nt_domain IS NOT NULL AND @nt_domain <> @host_name BEGIN DECLARE @user_nonquoted nvarchar(128) = @nt_domain + '\YourUserName'; DECLARE @user nvarchar(128) = QUOTENAME(@user_nonquoted); IF @user_nonquoted NOT IN (SELECT name FROM sys.database_principals) EXEC ('CREATE LOGIN ' + @user + ' FROM WINDOWS'); IF @user_nonquoted NOT IN (SELECT name FROM sys.server_principals) EXEC ('CREATE USER ' + @user + ' FOR LOGIN ' + @user); END