Files
PowderCoatingLogix/fix-customer-email-index.sql
T
2026-04-23 21:38:24 -04:00

62 lines
1.9 KiB
Transact-SQL

-- ============================================================================
-- Fix Customer Email Index for Multi-Tenancy
-- This allows the same email to exist across different companies
-- but prevents duplicate emails within the same company
-- ============================================================================
USE PowderCoatingDb
GO
-- Step 1: Check if the old index exists
IF EXISTS (SELECT * FROM sys.indexes WHERE name = 'IX_Customers_Email' AND object_id = OBJECT_ID('Customers'))
BEGIN
PRINT 'Dropping old IX_Customers_Email index...'
-- Drop the old unique index that enforces global email uniqueness
DROP INDEX IX_Customers_Email ON Customers
PRINT 'Old index dropped successfully.'
END
ELSE
BEGIN
PRINT 'Old index IX_Customers_Email not found (may have already been dropped).'
END
GO
-- Step 2: Create new unique index scoped to CompanyId
PRINT 'Creating new company-scoped IX_Customers_Email index...'
CREATE UNIQUE INDEX IX_Customers_Email
ON Customers (CompanyId, Email)
WHERE [Email] IS NOT NULL AND [IsDeleted] = 0
GO
PRINT 'New index created successfully!'
PRINT ''
PRINT 'The Customers table now allows:'
PRINT ' ✓ Same email across different companies'
PRINT ' ✓ Prevents duplicate emails within the same company'
PRINT ' ✓ Ignores soft-deleted records'
GO
-- Step 3: Verify the new index
SELECT
i.name AS IndexName,
i.is_unique AS IsUnique,
STUFF((
SELECT ', ' + COL_NAME(ic.object_id, ic.column_id)
FROM sys.index_columns ic
WHERE ic.object_id = i.object_id AND ic.index_id = i.index_id
ORDER BY ic.key_ordinal
FOR XML PATH('')
), 1, 2, '') AS IndexColumns,
i.filter_definition AS FilterDefinition
FROM sys.indexes i
WHERE i.object_id = OBJECT_ID('Customers')
AND i.name = 'IX_Customers_Email'
GO
PRINT ''
PRINT 'Index verification complete. You can now seed customer data!'
GO