Introduction
DACPAC (Data-Tier Application Package) deployments use SQL Server Data Tools (SSDT) to publish database schema changes. When deployment fails, database schema is not updated, blocking application changes and releases.
Symptoms
Schema conflict:
```bash $ sqlpackage /Action:Publish /SourceFile:database.dacpac /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;"
Error SQL72014: .Net SqlClient Data Provider: Msg 50000, Level 16, State 127, Line 6 Rows were detected. The schema update is terminating because data loss might occur. ```
Permission denied:
Error SQL72045: Script execution error. The EXECUTE permission was denied on the object 'sp_addextendedproperty', database 'mssqlsystemresource', schema 'sys'.Deployment timeout:
Error: The operation has timed out. Deployment exceeded maximum time limit.Common Causes
- 1.Data loss prevention - Schema change would delete data
- 2.Insufficient permissions - User lacks ALTER or CREATE permissions
- 3.Blocking transactions - Active transactions preventing schema changes
- 4.Object dependencies - Dependent objects blocking drop/alter
- 5.DACPAC version mismatch - Incompatible DACPAC and database versions
- 6.Connection timeout - Large deployment exceeding timeout
- 7.Storage full - Database cannot grow during deployment
Step-by-Step Fix
Step 1: Check Deployment Report
```bash # Generate deployment report without executing sqlpackage /Action:DeployReport \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;" \ /OutputPath:deploy-report.xml
# Review report for issues cat deploy-report.xml
# Shows planned operations: # - Schema changes # - Data movement # - Potential issues ```
Step 2: Check Database Permissions
```sql -- Verify user permissions sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT dp.name as DatabaseUser, dp.type_desc as UserType, permission_name, state_desc FROM sys.database_permissions p JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id WHERE dp.name = 'deployment_user' "
-- Required permissions for deployment: -- ALTER on schema -- CREATE TABLE/PROCEDURE/VIEW -- REFERENCES on foreign keys -- INSERT/UPDATE/DELETE for data motion
-- Grant missing permissions GRANT ALTER ON SCHEMA::dbo TO deployment_user; GRANT CREATE TABLE TO deployment_user; GRANT CREATE PROCEDURE TO deployment_user; ```
Step 3: Handle Data Loss Errors
```bash # If deployment blocked by potential data loss # Option 1: Allow data loss (CAUTION - use only if acceptable) sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;" \ /p:BlockOnPossibleDataLoss=false
# Option 2: Handle data migration manually # 1. Create new column # 2. Migrate data # 3. Drop old column
# Option 3: Use /p:GenerateSmartDefaults=true sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"..." \ /p:GenerateSmartDefaults=true ```
Step 4: Check for Blocking Transactions
```sql -- Check for active blocking transactions sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT t.session_id, t.transaction_id, t.name, t.transaction_begin_time, s.host_name, s.program_name, r.wait_type, r.wait_time FROM sys.dm_tran_active_transactions t JOIN sys.dm_tran_session_transactions st ON t.transaction_id = st.transaction_id JOIN sys.dm_exec_sessions s ON st.session_id = s.session_id LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id WHERE t.transaction_begin_time < DATEADD(minute, -5, GETDATE()) "
-- Kill long-running transaction if safe KILL 53; ```
Step 5: Handle Object Dependencies
```sql -- Check for dependent objects sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT OBJECT_NAME(referencing_id) as referencing_object, OBJECT_NAME(referenced_id) as referenced_object FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('TableToDrop') "
-- Drop dependent objects first DROP VIEW ViewDependentOnTable; DROP PROCEDURE ProcDependentOnTable; -- Then drop the table DROP TABLE TableToDrop; ```
Step 6: Increase Timeout for Large Deployments
```bash # Increase command timeout for large deployments sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;Connect Timeout=600;" \ /p:CommandTimeout=1800 # 30 minutes
# For Azure DevOps pipelines - task: SqlAzureDacpacDeployment@1 inputs: azureSubscription: 'MySubscription' ServerName: 'my-server.database.windows.net' DatabaseName: 'my-db' SqlUsername: 'admin' SqlPassword: '$(sqlPassword)' DacpacFile: 'database.dacpac' AdditionalArguments: '/p:CommandTimeout=1800' ```
Step 7: Check Database Storage
```bash # Check database size and limit az sql db show \ --name my-db \ --server my-server \ --resource-group my-rg \ --query '{MaxSize:maxSizeBytes,Used:allocatedStorageInBytes}'
# Increase max size if needed az sql db update \ --name my-db \ --server my-server \ --resource-group my-rg \ --max-size 500GB ```
Step 8: Validate DACPAC Version
```bash # Check DACPAC version unzip -p database.dacpac DacMetadata.xml
# Output shows version: # <DacType Name="MyDatabase" Version="1.0.0.0">
# Check target database version sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT name, type, type_version FROM sysdac_instances "
# If version mismatch, regenerate DACPAC from current database sqlpackage /Action:Extract \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;" \ /TargetFile:current-schema.dacpac ```
Step 9: Use Incremental Deployment
```bash # Generate incremental script instead of deploying sqlpackage /Action:Script \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;" \ /OutputPath:deploy-script.sql
# Review and execute script manually cat deploy-script.sql
# Execute in parts if needed sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -i deploy-script-part1.sql sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -i deploy-script-part2.sql ```
Step 10: Monitor Deployment Progress
```sql -- Monitor deployment progress sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT session_id, command, percent_complete, estimated_completion_time / 60 as minutes_remaining, start_time FROM sys.dm_exec_requests WHERE command LIKE '%ALTER%' OR command LIKE '%CREATE%' "
-- Check for deployment errors sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT TOP 10 ERROR_NUMBER() as ErrorNumber, ERROR_MESSAGE() as ErrorMessage, ERROR_SEVERITY() as Severity FROM sys.messages WHERE language_id = 1033 " ```
DACPAC Deployment Options
| Option | Purpose | Use Case |
|---|---|---|
| BlockOnPossibleDataLoss | Block data loss | Production safety |
| GenerateSmartDefaults | Auto-populate columns | Non-null constraints |
| CompareUsingModel | Schema comparison | Faster comparison |
| DropObjectsNotInSource | Remove extra objects | Clean deployments |
| AllowIncompatiblePlatform | Version override | Cross-version deploy |
Verification
```bash # After successful deployment sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;"
# Verify schema version sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT name, type_version FROM sysdac_instances "
# Test application connectivity sqlcmd -S my-server.database.windows.net -d my-db -U admin -P password -Q " SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES "
# Should show all expected tables ```
Prevention
To prevent Azure SQL DACPAC deployment issues from recurring, implement these proactive measures:
1. Validate DACPAC Before Deployment
```bash # Pre-deployment validation script sqlpackage /Action:DeployReport \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:my-server.database.windows.net;Database=my-db;User ID=admin;Password=***;" \ /OutputPath:deploy_report.xml
# Check for blocking changes cat deploy_report.xml | grep -i "error|warning" ```
2. Use Schema Compare in CI/CD
# Azure DevOps pipeline
- task: SqlDacpacDeploymentOnMachineGroup@0
inputs:
TaskType: 'sqlSchemaCompare'
SourcePath: '$(Build.ArtifactStagingDirectory)/database.dacpac'
TargetConnectionString: $(TargetConnectionString)
PublishProfile: 'publish.xml'3. Test Deployments in Staging First
```bash # Deploy to staging database first sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:staging-server.database.windows.net;Database=my-db;..."
# Run integration tests dotnet test
# If successful, deploy to production sqlpackage /Action:Publish \ /SourceFile:database.dacpac \ /TargetConnectionString:"Server=tcp:prod-server.database.windows.net;Database=my-db;..." ```
Best Practices Checklist
- [ ] Validate DACPAC before deployment
- [ ] Use schema compare in CI/CD
- [ ] Test in staging environment first
- [ ] Review deployment reports
- [ ] Back up before deployment
- [ ] Document schema changes
Related Issues
- [Fix Azure SQL Database Deadlock](/articles/fix-azure-sql-database-deadlock)
- [Fix Azure SQL Database DTU Limit](/articles/fix-azure-sql-database-dtu-limit)
- [Fix Azure SQL Transaction Log Full](/articles/fix-azure-sql-transaction-log-full)
Related Articles
- [Technical troubleshooting: Fix Azure Aks Pod Crashloopbackoff Issue in Azure](azure-aks-pod-crashloopbackoff)
- [Technical troubleshooting: Fix Azure Api Management Policy Expression Runtime](azure-api-management-policy-expression-runtime-error)
- [Technical troubleshooting: Fix Azure App Configuration Feature Flag Not Refre](azure-app-configuration-feature-flag-not-refreshing)
- [Technical troubleshooting: Fix Azure App Service 503 Always On Disabled Issue](azure-app-service-503-always-on-disabled)
- [Technical troubleshooting: Fix Azure Application Gateway Err SSL Unrecognized](azure-application-gateway-err-ssl-unrecognized-name-alert)
<script type="application/ld+json"> { "@context": "https://schema.org", "@type": "TechArticle", "headline": "Fix Azure SQL DACPAC Deployment Failed", "description": "Troubleshoot Azure SQL DACPAC deployment failures. Check schema conflicts, permissions, and deployment options.", "url": "https://www.fixwikihub.com/fix-azure-sql-dacpac-deployment-failed", "publisher": { "@type": "Organization", "name": "FixWikiHub", "url": "https://www.fixwikihub.com" }, "author": { "@type": "Person", "name": "FixWikiHub Editorial Team" }, "datePublished": "2026-04-03T19:24:57.145Z", "dateModified": "2026-04-03T19:24:57.145Z" } </script>