2016-04-18 16 views
5

Sono un po 'un debuttante di SQL, quindi per favore sopporta me su questo. Il mio progetto è il seguente:MSSQL: esiste un modo per aggiungere automaticamente una voce a una tabella quando una voce viene aggiunta a un'altra tabella?

Utilizzo di MSSQL su Windows Server 2008 R2.

Esiste una tabella di database esistente, chiamiamola PRODOTTI, che contiene diverse migliaia di righe di dati, ovvero le informazioni sul prodotto per ogni azienda X di prodotti venduti. Le tre colonne a cui sono interessato sono ITEMGROUPID, ITEMID e ITEMNAME. L'ITEMID è la chiave primaria per questa tabella ed è un codice prodotto univoco. ITEMGROUPID indica in quale categoria di prodotti cade ciascun articolo e ITEMNAME si spiega da sé. Mi interessa solo una categoria di prodotti, quindi utilizzando ITEMGROUPID posso determinare quante righe avrà la mia tabella (attualmente 260).

Sto creando una tabella contenente alcuni parametri per rendere ciascuno di questi prodotti, chiamiamolo LINEPARAMETRI. Ad esempio, quando creiamo il Widget A, abbiamo bisogno che il Trasportatore B funzioni a Velocità C. Ho intenzione di creare una chiave esterna nella mia tabella, indicando l'ITEMID nell'altra tabella. Quindi ogni riga nella mia nuova tabella farà riferimento a un prodotto specifico nel database del prodotto esistente.

La mia domanda è, se si sviluppa un nuovo prodotto che corrisponde ai miei criteri (ITEMGROUPID = 'VALUE'), e inserito nella tabella esistente con un ITEMID, c'è un modo per la mia tabella di generare automaticamente una nuova riga con quel ITEMID e valori di default in tutte le altre colonne?

risposta

3

Si potrebbe creare un trigger che spara su Inserisci per product e inserisce una riga nella lineparameters, in questo modo:

create trigger line_parameter_inserter 
on products 
after insert 
as 
    insert into lineparameters (productId, col1, col2) 
    values (inserted.id, 'foo', 'bar'); 

ma una scelta migliore è quella di creare una chiave esterna dalla tabella prodotto al vostro gruppo tavolo predefiniti, in questo modo una riga deve essere presente nella tabella di default prima si inserisce la tabella prodotto, in questo modo:

create table lineparameters (
    id int, 
    col1 int, 
    ..., 
    primary key (id) 
) 

create table products (
    id int, 
    lineparametersId int not null, 
    ... 
    primary key (id), 
    foreign key (lineparametersId) references lineparameters(id) 
) 

Ciò creerà un processo solido e assicura tha t anche se qualcuno (silenziosamente) disabilita/cancella il trigger, non si avranno problemi di integrità dei dati.

+0

Non sono abbastanza sicuro di cosa intendi, c'è un modo leggermente diverso per esprimerlo? Per rendere meno ambiguo il tavolo a cui ti riferisci, ho modificato il mio post per dare ai due nomi definiti tabelle - potresti spiegare il tuo suggerimento usando quei nomi di tabella per evitare confusione? – ASForrest

+0

@ASForrest OK, risposta aggiornata con esempio di codice – Bohemian

+0

Ottenuto, ha senso. Tuttavia, solo circa il 10% dei prodotti nella tabella PRODOTTI richiede effettivamente una voce nella mia tabella (quelli in cui ITEMGROUPID = 'VALUE'), quindi mentre vedo il valore nel garantire che non ci siano problemi di integrità dei dati, non sono sicuro è la mia migliore strada da seguire. Tutto sommato, non è uno stopper se quel trigger dovesse essere cancellato; farlo automaticamente è davvero solo un piacere. Se dovessi attenermi al metodo di attivazione, come potrei modificare il codice di attivazione per inserire solo una riga in LINEPARAMETERS se la riga che era appena stata inserita in PRODOTTI ha (ITEMGROUPID = 'VALUE')? – ASForrest

Problemi correlati