Je souhaite restreindre la suppression d'une ligne spécifique. Par exemple, si quelqu'un souhaite tronquer une table ou supprimer tous les enregistrements de la table, un message d'erreur doit être renvoyé, pour un identifiant particulier, il n'est pas autorisé. J'ai utilisé le déclencheur pour le même mais il est inutile, car il ne se déclenche pas sur tronquer
Create TRIGGER vendorTrigger
ON [Vendor]
INSTEAD OF DELETE
AS
IF EXISTS(SELECT * FROM Vendor WHERE VendorId = 515)
BEGIN
RAISERROR ('Is not allowed to delete VendorId: 515 as it is of type corpnet',16, 1)
END
ELSE
BEGIN
Delete from Vendor Where VendorId in (Select VendorId From Vendor)
END
Si vous utilisez SQL Server 2016 ou une version ultérieure, vous pouvez envisager Sécurité au niveau de la ligne
Sinon, vous pouvez restreindre l'accès à des lignes spécifiques à l'aide des vues. Liens utiles:
Escalier vers SQL Server Security Level 10: Row-Level Security
TRUNCATE TABLE nécessite l'autorisation ALTER sur la table. La meilleure façon d'éviter de tronquer une table est de révoquer cette autorisation.
De plus, TRUNCATE TABLE ne peut pas activer un déclencheur car l'opération ne consigne pas les suppressions de lignes individuelles.
Voir plus sur TRUNCATE TABLE (Transact-SQL)
Je suis d'accord que les autorisations sont le moyen préféré pour gérer certaines opérations (comme TRUNCATE TABLE).
Si cela ne le coupe pas, alors spécifiquement pour TRUNCATE TABLE, vous pouvez avoir une clé étrangère se référant d'une autre table à cette table. Cette autre table peut être une table fictive et elle peut être vide. Vous pouvez même désactiver le FK. La présence du FK interdit TRUNCATE TABLE.
Mais, bien sûr, avec suffisamment de privilèges, cet utilisateur peut toujours faire des choses comme supprimer le FK, déposer et recréer la table. Etc.