Cannot Resolve the Collation Conflict Between SQL_Latin1_General_CP1_CI_AS and SQL_Latin1_General_CP1_CS_AS
Related Queries
- Cannot resolve the collation conflict between
SQL_Latin1_General_CP1_CI_ASandSQL_Latin1_General_CP1_CS_AS 0-Oracle_Serversjob succeeds but other Oracle collection jobs failSA_Oracle_Columnscollation conflictSA_Oracle_SDD_MatchHits hit_columncollation issue
Symptom
In Netwrix Access Analyzer, Oracle collection jobs fail with the following SQL exception, while the 0-Oracle_Servers job may still complete successfully:
Error while running script : Script Name [] , portion [66] : System.Data.SqlClient.SqlException (0x80131904): Cannot resolve the collation conflict between "SQL_Latin1_General_CP1_CI_AS" and "SQL_Latin1_General_CP1_CS_AS" in the equal to operation.
You may also observe that other database-related collection jobs fail with the same error if using Access Analyzer v11.6.
Cause
Access Analyzer uses a case-insensitive (CI) database collation by default, while Oracle’s data dictionary is case-sensitive. Certain Oracle-related columns must therefore use case-sensitive (CS) collation.
Schema updates that enforce this are managed through the SA_SQL_Patches table. If the required update is not applied or fails to update properly, those columns remain in CI collation, leading to a collation conflict during Oracle data collection.
Resolution
IMPORTANT: Back up the Access Analyzer database before making schema changes in SQL Server.
- Run the following SQL script against the Access Analyzer database to update the affected Oracle collection table columns to the required case-sensitive collation:
SET ANSI_PADDING ON
/****** SA_Oracle_Columns ******/
IF EXISTS (
SELECT 1
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('[dbo].[SA_Oracle_Columns]')
AND c.name = 'column_name'
AND c.collation_name <> 'SQL_Latin1_General_CP1_CS_AS' )
BEGIN
-- Drop the existing constraint
IF EXISTS (
SELECT 1
FROM sys.indexes i
INNER JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
INNER JOIN sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
WHERE i.object_id = OBJECT_ID('[dbo].[SA_Oracle_Columns]') AND i.name = 'UQ_SA_Oracle_Columns_names' )
BEGIN
ALTER TABLE [dbo].[SA_Oracle_Columns] DROP CONSTRAINT [UQ_SA_Oracle_Columns_names];
END
-- Alter the column collation
ALTER TABLE COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL;
-- Recreate the constraint
ALTER TABLE [dbo].[SA_Oracle_Columns] ADD CONSTRAINT [UQ_SA_Oracle_Columns_names] UNIQUE NONCLUSTERED
(
[sa_table_id] ASC,
[column_id] ASC,
[column_name] ASC
);
END
/****** SA_Oracle_SDD_MatchHits ******/
IF EXISTS (
SELECT 1
FROM sys.columns c
WHERE c.object_id = OBJECT_ID('[dbo].[SA_Oracle_SDD_MatchHits]')
AND c.name = 'hit_column'
AND c.collation_name <> 'SQL_Latin1_General_CP1_CS_AS' )
BEGIN
-- Alter the column collation
ALTER TABLE [dbo].[SA_Oracle_SDD_MatchHits] ALTER COLUMN [hit_column] [nvarchar](max) COLLATE SQL_Latin1_General_CP1_CS_AS NULL;
END
GO
- After running the script, run the Oracle collection jobs again and confirm that the collation conflict does not reoccur.