2016-03-22 6 views
0

Lets sagen, dass ich in der folgenden Tabelle haben:Prevent einzelne Zeile in SQL Server, aber lassen Sie andere Löschen von Zeilen in derselben Transaktion gelöscht werden

PKID | UID | FKID 
----------------- 
1 | ABC | 1 
2 | BCD | 2 
3 | CDE | 2 
4 | DEF | 1 
5 | EFG | 3 

Was will ich tun Block mit einem Trigger löscht (oder andere Art und Weise, wenn es gibt einen besseren Weg, dies zu tun, aber nur für die Zeilen, wo FKID = 1 ist, aber immer noch andere Zeilen gelöscht werden können. Also, wenn jemand DELETE FROM sampleTable tippt, würde ich nur die Zeilen 2, 3 und 5 löschen wollen, und 1 und 4 sollten bleiben.

+1

uh, warum nicht 'löschen yourtable wo fkid <> 1'? –

+1

Das ist seltsame Voraussetzung, aber wenn Sie das tun möchten, ist die Verwendung von "INSTED OF" Trigger der einzige Weg, den Sie gehen können. Würdest du bitte sagen, warum du das willst? – FLICKER

+0

Sie müssen Ihren Anwendungsfall hier besser verstehen. Wer ist der "Jemand", der die betreffende DELETE-Anweisung eingeben kann? – dazedandconfused

Antwort

0

Versuchen Sie dies.

CREATE TRIGGER dbo.trg_tablename_delete ON dbo.tablename 
    FOR DELETE 
    AS 
     SET NOCOUNT ON 

     IF EXISTS (SELECT * FROM deleted WHERE FKID = 1) 
     BEGIN 
      RAISERROR ('Cannot delete this record!', 0, 1) WITH NOWAIT 
      ROLLBACK 
     END 

     SET NOCOUNT OFF 
    GO