2013-07-01 38 views
7

有什麼方法可以在使用SqlPackage.exe發佈DACPAC時防止用戶被刪除,而不是更改下面的設置,這樣可以防止所有對象被刪除,不要在DACPAC中。防止用戶在使用SqlPackage.exe發佈DACPAC時丟棄

<DropObjectsNotInSource>True</DropObjectsNotInSource> 

我們部署了一些環境中,每個用戶不同。目前的解決辦法,其一是:

  1. 腳本爲每個環境的用戶部署
  2. 使用/Action:Script後重新創建它們並手動更改部署腳本。

這些都不是理想的,但...

回答

2

我們在後期部署腳本處理這個問題。設置起來有點困難,但一旦設置完成,您可以爲每個環境配置稍微不同的腳本。我們將這與每個環境使用不同配置文件的「發佈配置文件」結合使用。基本上,您可以使用Powershell爲用戶和權限生成一堆腳本,將這些腳本添加到項目中,然後將這些文件包含在項目中。將博客文章中提到的「SecurityAdditionsWrapper.sql」添加到您的部署後腳本中,您應該很好。只需從項目中刪除其他安全性,以確保其設置正確。

http://schottsql.blogspot.com/2013/05/ssdt-setting-different-permissions-per.html

也有在SSDT選項: 「落權限不在源」 - 假 「在源不能確定刪除角色成員」 - 假 「忽略權限」 - 真正的 「忽略的作用會員制」 - 真正的

我們使用的,但如果你的環境需要更好地控制用戶/權限,我強烈建議你檢查出該博客文章。 (與感謝傑米·湯姆遜原來的想法。)

+0

發現有與此這裏的MS連接問題: https://connect.microsoft.com/SQLServer/feedback/details/ 775839/ssdt-add-publication-setting-to-ignore-database-users 雖然,MS在2013年初將其標記爲「無法修復」。 – Michael12345

3

我遇到同樣的問題,使用前/後部署腳本重新插入用戶,權限,角色等類似建議的博客文章。然而,這成爲不可維護的,從長遠來看(用戶無法在部署過程中進行身份驗證,如果部署失敗的權限不恢復,安全更改需要通過源控制,並重新部署去)。

最近,我們在遷移我們的部署平臺時重新評估了這個問題。通過發佈DacFx API(和bug fixes),我可以通過創建DeploymentPlanModifier來擴展SSDT中的部署過程。它們提供了一個example for filtering objects on creation,用簡單的修改I濾波器用於基於權限對象類型的任何滴(使用/p:AdditionalDeploymentContributors參數)。

[ExportDeploymentPlanModifier(UserMappingFilter.PlanFiltererContributorId, "1.0.0.0")] 
public class UserMappingFilter : DeploymentPlanModifier 
{ 
    public const string PlanFiltererContributorId = "Dac.UserMappingFilter"; 

    protected override void OnExecute(DeploymentPlanContributorContext context) 
    { 
     DeploymentStep next = context.PlanHandle.Head; 
     while(next != null) 
     { 
      DeploymentStep current = next; 
      next = current.Next; 

      DropElementStep dropStep = current as DropElementStep; 
      if(dropStep != null && ShouldFilter(dropStep)) 
      { 
       base.Remove(context.PlanHandle, dropStep); 
      } 
     } 
    } 

    private bool ShouldFilter(DropElementStep createStep) 
    { 
     TSqlObject target = createStep.TargetElement; 


     if(target.ObjectType.Name == "RoleMembership" || target.ObjectType.Name == "User" || target.ObjectType.Name == "Role") 
     { 
      return true; 
     } 


     return false; 
    } 
} 
+0

請問你能解釋一下怎麼做?我找不到如何安裝/設置/不管這個。我發現了一些需要創建的dll,以便將其作爲/ p:AdditionalDeploymentContributors參數傳遞,但是我找不到如何創建此dll –

+0

嗨sidux - 您可以使用爲您預先製作的這個dll或用它作爲編寫你自己的基礎:http://agilesqlclub.codeplex.com/(我寫它) - 更多細節https://the.agilesql.club/Blogs/Ed-Elliott/HOWTO-Filter-Dacpac-部署 –

+0

如何使用您自己的?我正在與Ed(Agilesqlclub的作者)進行交流,我們無法正常工作。我正在與VS2012 SSDT合作。主要問題是我不知道VS2012使用的SqlPackage.exe位於哪裏。我嘗試過搜索,還有很多其他的東西,但仍然沒有效果 –

2

使用SqlPackage。exe文件參數(自2015年2月份發佈:New Advanced Publish Options to Specify Object Types to Exclude or Not Drop):

下面是我們在部署中使用的實際參數:

/p:DropObjectsNotInSource=True 
/p:ExcludeObjectTypes=Users;Logins;RoleMembership;Permissions 

第一行清除所有,但下一行進一步細化什麼不能下降。這種組合證明了我們最有效的方式放棄所有不必要的對象,但仍保留登錄映射。

所有的參數及其可能的值的詳細文檔可以從MSDN - SqlPackage.exe

+0

也可能需要排除:'Credentials; DatabaseScopedCredentials' –