2009-01-08 15 views
1

Est-il possible de forcer une colonne dans une table SQL Server 2005 à une certaine valeur sans tenir compte de la valeur utilisée dans une instruction d'insertion ou de mise à jour? Fondamentalement, il y a un bogue dans une application à laquelle je n'ai pas accès et qui tente d'insérer une date du 1/1/0001 dans une colonne datetime. Cela génère une exception de dépassement SqlDateTime. Puisque cette colonne n'est même pas utilisée pour quelque chose, j'aimerais mettre à jour les contraintes sur les colonnes ou quelque chose dans la base de données pour éviter l'erreur. Ceci est évidemment juste un patch d'urgence temporaire pour éviter le problème ... Idées bienvenues ...Forcer la colonne SQL Server à une valeur spécifique

Répondre

1

Si c'est une application tierce alors je vais supposer que vous n'avez pas accès à la procédure stockée, ou logique utilisé pour générer et insérer cette valeur (il est toujours utile de vérifier les SP pour la base de données de l'application, pour voir si vous pouvez les modifier). Comme Charles l'a suggéré, si n'avez pas ont accès à la source, alors vous devez avoir un déclencheur sur l'insertion.

L'article Microsoft here vous donnera des informations détaillées sur la création de déclencheurs. Cependant, SQL Server n'a pas de véritable déclencheur 'before insert' (à ma connaissance), vous devez donc essayer INSTEAD OF. Jetez un oeil here pour plus d'informations. Dans cet article, payer note en particulier de l'article 37.7, et l'exemple suivant (à nouveau de cet article):

CREATE TRIGGER T_InsertInventory ON CurrentInventory 
INSTEAD OF INSERT AS 
BEGIN 
INSERT INTO Inventory (PartNumber, Description, QtyOnOrder, QtyInStock) 
SELECT PartNumber, Description, QtyOnOrder, QtyInStock 
FROM inserted 
END 

Nick.

+0

Merci pour l'exemple précis, c'est exactement ce dont j'ai besoin. –

4

Comment insérer le montant? Si c'est à travers un proc stocké ... vous pouvez simplement modifier le Sproc pour ignorer ce paramètre d'entrée.

si elle est par côté client SQL généré, ou un outil ORM, Otoh, puis afaik, la seule option est un « avant » Trigger qui « remplace » la valeur avec un un acceptable ...

+0

D'accord. Jetez un oeil à INSTEAD OF TRIGGER. – MarlonRibunal

0

la le hack le plus simple serait d'en faire un varchar, et de l'insérer comme une ficelle dans la colonne. La réponse la plus compliquée est, vous pouvez masser les données avec un déclencheur, mais il devrait encore être valide en premier lieu. Par exemple, je peux réinitialiser une valeur de champs dans un déclencheur de mise à jour/insertion, mais il faudrait tout d'abord passer à travers l'insertion.

3

Si vous utilisez SQL 2005, vous pouvez créer un déclencheur INSTEAD OF. Le code de ce déclencheur wil courir à la place de l'insert d'origine/mise à jour

-Edoode

Questions connexes