COLLATION et index de base
Bonjour a tous
Je m'occupe de reprise de donnee . De ce faite j'ai des base en collation differente. Certaine sont en FRENCH d'autre en Latins ect....
Mon probleme est que je suis obliger de casser tous les indexs afin de changer les collations des tables des bases sources pour les mettre tous en FRENCH.
Y a til un moyen de les changer lors de la restauration de la base???
Je n'ai pas trouvé, donc dans un premier temps je me suis amusé à casser les index et contrainte des tables pour changer les collation:evilred:.
Du coup je me suis dis qu'avec les table master y a un moyen de casser tous ca. Mais ca marche un fois sur deux. Car je pense qu'il doit avoir un ordre pour les cassées ses index.
Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
| DECLARE @ncvRequete AS NVARCHAR(4000);
DECLARE @contraintName as VARCHAR(4000)
DECLARE @nameTable as VARCHAR(4000)
DECLARE @nameTable2 as VARCHAR(4000)
DECLARE @schemaTable as VARCHAR(4000)
DECLARE cur CURSOR FOR
SELECT
pk.TABLE_SCHEMA AS PK_TableSchema,
pk.TABLE_NAME AS PK_TableName,
fk.CONSTRAINT_NAME AS FK_ConstraintName
--fk.TABLE_SCHEMA AS FK_TableSchema,
,fk.TABLE_NAME AS FK_TableName
--fk_col.COLUMN_NAME AS FK_ColumnName,
--,pk_col.ORDINAL_POSITION AS OrdinalPosition
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pk
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE pk_col ON
pk_col.CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND
pk_col.CONSTRAINT_NAME = pk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc ON
rc.UNIQUE_CONSTRAINT_SCHEMA = pk.CONSTRAINT_SCHEMA AND
rc.UNIQUE_CONSTRAINT_NAME = pk.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS fk ON
fk.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND
fk.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE fk_col ON
fk_col.CONSTRAINT_SCHEMA = rc.CONSTRAINT_SCHEMA AND
fk_col.CONSTRAINT_NAME = rc.CONSTRAINT_NAME AND
fk_col.ORDINAL_POSITION = pk_col.ORDINAL_POSITION
WHERE
pk.CONSTRAINT_TYPE = 'PRIMARY KEY' AND
fk.CONSTRAINT_TYPE = 'FOREIGN KEY'
--AND PK_TableSchema = 'dbo'
ORDER BY
pk.TABLE_SCHEMA,
pk.TABLE_NAME,
fk.CONSTRAINT_NAME,
fk.TABLE_SCHEMA,
fk.TABLE_NAME,
pk_col.ORDINAL_POSITION
OPEN cur;
FETCH NEXT FROM cur INTO @schemaTable, @nameTable, @contraintName, @nameTable2
WHILE @@FETCH_STATUS = 0
BEGIN
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable+']') AND name = N''+@contraintName+'')
--IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].[' + @contraintName +']') AND parent_object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable+']'))
BEGIN
SET @ncvRequete = 'ALTER TABLE ['+ @schemaTable+'].['+@nameTable+'] DROP CONSTRAINT [' + @contraintName +']'
PRINT @ncvRequete + ' ... T1' +@nameTable;
END
ELSE
BEGIN
IF EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'['+@schemaTable+'].[' + @contraintName +']') AND parent_object_id = OBJECT_ID(N'['+@schemaTable+'].['+@nameTable2+']'))
BEGIN
SET @ncvRequete = 'ALTER TABLE ['+ @schemaTable+'].['+@nameTable2+'] DROP CONSTRAINT [' + @contraintName +']'
PRINT @ncvRequete + ' ... T2' +@nameTable;
END
END
EXECUTE sp_executeSql @ncvRequete;
FETCH NEXT FROM cur INTO @schemaTable, @nameTable, @contraintName, @nameTable2
END;
CLOSE cur;
DEALLOCATE cur; |
Voyerz vous le probleme pour lequel ca ne marche pas toujours???
Comment savoir l'ordre dans lequel on peut supprimer les index?
Connaitriez vous un moyen de supprimer tous les index et contrainte de tous les tables d'une base?
Merci d'avance de vos reponse.
Shakta