SQLPackage生成脚本含REVOKE CONNECT,如何移除该语句?
问题原因与解决方案:SqlPackage生成脚本中出现REVOKE CONNECT的问题
核心原因
当通过SqlPackage从现有数据库提取结构生成DACPAC,再基于DACPAC生成部署脚本时,出现CREATE USER [thatuser] FOR LOGIN [thatuser];后紧跟REVOKE CONNECT TO [thatuser];的原因如下:
CONNECT权限默认由public角色授予所有数据库用户,DACPAC默认提取逻辑不会主动捕获这种“默认继承”的权限,仅当权限被显式修改(比如手动执行过REVOKE)时才会被纳入模型。- SqlPackage生成部署脚本时,严格以DACPAC模型为基准对齐目标数据库状态。由于模型中没有
GRANT CONNECT的显式定义,它会生成REVOKE CONNECT语句,将用户的CONNECT权限重置为“仅继承public角色”的默认状态——但显式REVOKE会覆盖public的默认授予,导致用户暂时无法连接数据库。
最优解决方案
方案1:提取时包含用户权限
修改你的数据库提取命令,添加/p:ExtractPermissions=true参数,让SqlPackage将用户的所有权限(包括CONNECT)一并提取到数据库项目中。修改后的提取命令:
SqlPackage /Action:Extract /TargetFile:P-$servername-$databasename/sql_schema /DiagnosticsFile:P-$servername-$databasename/$date.log ` /p:ExtractAllTableData=false /p:VerifyExtraction=true /SourceServerName:$servername ` /SourceDatabaseName:$databasename /SourceUser:sqluser /SourcePassword:"passwordgoeshere" /p:ExtractTarget=ObjectType ` /p:ExtractPermissions=true
提取完成后,项目中会自动生成包含GRANT CONNECT TO [thatuser];的权限脚本,后续构建的DACPAC模型会包含该权限定义,生成的部署脚本将仅保留CREATE USER语句,或同步正确的GRANT CONNECT操作,不会再生成REVOKE CONNECT。
方案2:手动添加权限定义到项目
如果无法调整提取流程,可以在数据库项目中手动添加权限脚本:
- 在项目内创建新的SQL文件(如
UserPermissions.sql) - 写入以下内容(替换为你的用户名单):
GRANT CONNECT TO [thatuser]; -- 若有其他需要保留的权限,可在此一并添加
构建DACPAC后,模型会包含该权限定义,部署脚本将自动执行GRANT CONNECT,覆盖默认的REVOKE行为。
方案3:调整部署脚本生成参数
在生成部署脚本的命令中添加/p:IncludePermissions=true参数,确保权限变更被纳入脚本逻辑:
$formattedDate = (Get-Date).ToString("yyyyMMdd_HHmmss") sqlpackage /action:script /SourceFile:"$home\Documents\Gitlab_Repos\database_projects\P-switchclaims-$databasename\bin\Debug\P-switchclaims-$databasename.dacpac" ` /TargetServerName:$servername ` /TargetDatabaseName:$databasename ` /TargetUser:sqladmin_az_dev /TargetPassword:"$password" ` /DeployScriptPath:"$home\Documents\to_deploy\deployscript-$databasename-$($formattedDate).sql" ` /p:ScriptDatabaseOptions=False ` /p:DoNotAlterReplicatedObjects=true ` /p:DropObjectsNotInSource=false ` /p:AdditionalDeploymentContributors=AgileSqlClub.DeploymentFilterContributor ` /p:AdditionalDeploymentContributorPaths=$home\Documents\Gitlab_Repos\DACtools ` /p:AdditionalDeploymentContributorArguments="SqlPackageFilter0=IgnoreName(.*_azurelogin);SqlPackageFilter1=IgnoreName(sp_MS.*);" ` /p:IncludePermissions=true
该方案需配合提取时的权限配置使用,才能彻底解决REVOKE CONNECT问题。
内容的提问来源于stack exchange,提问作者mbourgon
相关产品推荐
相关产品推荐

