OK, j'ai une table sans clé naturelle, seulement une colonne d'identité entière comme sa clé primaire. Je voudrais insérer et récupérer la valeur d'identité, mais également utiliser un déclencheur pour m'assurer que certains champs sont toujours définis. À l'origine, la conception devait utiliser à la place des déclencheurs d'insertion, mais cela casse l'identité scope_identity. La clause de sortie de l'instruction insert est également rompue par le paramètre insert au lieu de insert. Alors, je suis venu avec un autre plan et je voudrais savoir s'il y a quelque chose de toute évidence mal avec ce que je compte faire:SCOPE_IDENTITY Et au lieu de Insert Trigger contourner
commencent exemple artificiel:
CREATE TABLE [dbo].[TestData] (
[TestId] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[Name] [nchar](10) NOT NULL)
CREATE TABLE [dbo].[TestDataModInfo](
[TestId] [int] PRIMARY KEY NOT NULL,
[RowCreateDate] [datetime] NOT NULL)
ALTER TABLE [dbo].[TestDataModInfo] WITH CHECK ADD CONSTRAINT
[FK_TestDataModInfo_TestData] FOREIGN KEY([TestId])
REFERENCES [dbo].[TestData] ([TestId]) ON DELETE CASCADE
CREATE TRIGGER [dbo].[TestData$AfterInsert]
ON [dbo].[TestData]
AFTER INSERT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
INSERT INTO [dbo].[TestDataModInfo]
([TestId],
[RowCreateDate])
SELECT
[TestId],
current_timestamp
FROM inserted
-- Insert statements for trigger here
END
Fin exemple artificiel.
Non, je ne le fais pas pour un petit champ de date - c'est juste un exemple.
Les champs que je veux m'assurer sont définis ont été déplacés vers une table séparée (dans TestDataModInfo) et le déclencheur s'assure qu'il est mis à jour. Cela fonctionne, il me permet d'utiliser scope_identity() après les insertions, et semble être sûr (si mon déclencheur après échoue, mon insertion échoue). Est-ce une mauvaise conception, et si oui, pourquoi?
Merci Joel - n'a pas vu ma propre frappe bâclée. –
Je suppose que vous validez des champs dans des déclencheurs plutôt que des contraintes en raison de données héritées? – Maslow
@Maslow, les triggers devraient être le moyen le plus simple et le plus sûr de s'assurer que certains champs sont toujours ou jamais mis à jour (updateDate, createdate). Cela garantit que vous ne pouvez pas enfreindre ces règles, sauf si vous avez également la permission de désactiver les déclencheurs. Juste une couche supplémentaire de protection. –