Je suis un développeur java qui a fait partie d'une équipe sans DBA et où, en tant que développeur, je ne peux pas obtenir de droits DBA. J'ai été chargé de déplacer un schéma entier entre deux bases de données, donc sans avoir un DBA, je devais le faire et le faire en exécutant des scripts, ne pouvant pas utiliser l'interface graphique dans SQL Server 2008 car je n'avais pas de privilèges d'administrateur.
Tout a été déplacé sans problème, cependant, lors de l'exécution d'une procédure stockée sur la nouvelle table schema.table, j'ai trouvé que j'avais perdu le champ d'identité dans une table. J'ai revérifié le script qui a créé la table et il était là, cependant, SQL Server ne l'a pas obtenu lorsque j'ai exécuté le script. Un DBA m'a dit plus tard qu'il avait déjà vu ce même problème auparavant.
En tout état de cause, pour SQL Server 2008, ce sont les étapes que j'ai prises pour résoudre ce problème et cela a fonctionné, donc je le poste ici dans l'espoir que cela sera utile à quelqu'un. C'est ce que j'ai fait car j'avais des dépendances FK sur une autre table qui ont rendu cela plus difficile:
J'ai utilisé cette requête pour vérifier que l'identité était effectivement manquante et pour afficher les dépendances sur la table.
1.) Trouvez des statistiques sur un tableau:
exec sp_help 'dbo.table_name_old';
2.) Créez une nouvelle table identique en double, sauf ajoutez un champ d'identité sur le champ PK où il se trouvait auparavant.
3.) Désactivez l'identité pour déplacer les données.
SET IDENTITY_INSERT dbo.table_name ON
4.) Transférez les données.
INSERT INTO dbo.table_name_new
(
field1, field2, etc...
)
SELECT
field1, field2, etc...
FROM
dbo.table_name_old;
5.) Vérifiez que les données sont là.
SELECT * FROM dbo.table_name_new
6.) Réactivez l'identité.
SET IDENTITY_INSERT ToyRecP.ToyAwards.lkpFile_New OFF
7.) C'est le meilleur script que j'ai trouvé pour obtenir toutes les relations FK pour vérifier quelle (s) table (s) les références de table d'origine en tant que dépendances et j'en ai rencontré beaucoup, c'est donc un gardien!
SELECT f.name AS ForeignKey,
OBJECT_NAME(f.parent_object_id) AS TableName,
COL_NAME(fc.parent_object_id, fc.parent_column_id) AS ColumnName,
OBJECT_NAME (f.referenced_object_id) AS ReferenceTableName,
COL_NAME(fc.referenced_object_id, fc.referenced_column_id) AS ReferenceColumnName
FROM sys.foreign_keys AS f
INNER JOIN sys.foreign_key_columns AS fc
ON f.OBJECT_ID = fc.constraint_object_id
ORDER BY ReferenceTableName;
8.) Assurez-vous que vous disposez de tous les scripts PK et FK pour toutes les tables impliquées, avant cette étape suivante.
9.) Vous pouvez cliquer avec le bouton droit sur chaque clé et l'écrire à l'aide de SQL Server 2008
10.) Supprimez les FK de la ou des tables de dépendances en utilisant cette syntaxe:
ALTER TABLE [dbo].[table_name] DROP CONSTRAINT [Name_of_FK]
11.) Déposez la table d'origine:
DROP TABLE dbo.table_name_old;
13.) Ces étapes suivantes s'appuient sur les scripts que vous avez créés dans SQL Server 2008 à l'étape 9.
--Ajouter le PK à la nouvelle table.
--Ajouter le FK à la nouvelle table.
--Ajouter le dos du FK à la table des dépendances.
14.) Vérifiez que tout est correct et complet. J'ai utilisé l'interface graphique pour regarder les tableaux.
15.) Renommez la nouvelle table en son nom d'origine.
exec sp_RENAME '[Schema_Name.OldTableName]' , '[NewTableName]';
Enfin, tout a fonctionné!