2014-01-31 4 views
0

Предположим, что у нас есть таблица с именем StudentAccount с столбцами SID (идентификатор студента) и AmountOwing. Мы не можем удалить учетную запись из системы, если ученик ничего не должен на их счете. (Это AmountOwing = $0.00).Как предотвратить стирание строки в зависимости от значения столбца

Например, таблица может выглядеть следующим образом:

SID | Amount Owing 
-------+-------------- 
32415 | $30.00 
39872 | $0.00 
35135 | $3200.00 

В этом случае, мы можем удалить только строку 2.

Есть ли способ принудить это ограничение к таблице с использованием синтаксиса SQL MS SQL Server 2012 SQL (чтобы необразованный пользователь не случайно удалил непустую учетную запись)?

+1

Я думаю, вам нужно использовать триггер 'before delete' для реализации этого. –

+1

использовать перед триггером удаления, проверяя значение, если нет 0 отменить действие удаления, однако каскадные удаления не могут быть активированы для этого. http://msdn.microsoft.com/en-us/library/ms189799.aspx – xQbert

+0

@xQbert Что вы подразумеваете под удалением каскада, не может быть включено? Вы имеете в виду, что какая-то другая таблица не может каскадно удалить таблицу, в которую я хочу включить триггер? Или таблица, в которую я хочу включить триггер, не может каскадировать удаление других таблиц? Или каскад не удаляется во всей базе данных? – Maria

ответ

2

Попробуйте следующее:

CREATE TRIGGER trgD_StudentAccount_Delete 
ON dbo.StudentAccount 
INSTEAD OF DELETE 
AS 
BEGIN 
    IF EXISTS (
     SELECT * 
     FROM deleted d 
     WHERE d.AmountOwing <> 0 
    ) 
    BEGIN 
     ROLLBACK; 
     RAISERROR('Delete error: there are students with Amount <> 0', 16, 1); 
    END 
    ELSE 
    BEGIN 
     DELETE StudentAccount 
     WHERE EXISTS(SELECT * FROM deleted d WHERE d.[SID] = StudentAccount.[SID]) 
    END 
END 
-1

Советовать что у вас есть AmountOwing как значение числа (INT, поплавок, ...)

DELETE 
FROM StudentAccount 
WHERE AmountOwing > 0 

Или работать с триггером (так что пользователь не должен удалять любому)

CREATE TRIGGER DML_ON_TABLEA 
    ON StudentAccount 
    AFTER INSERT,UPDATE 
AS 
BEGIN 
    SET NOCOUNT ON; 

    CASE 
    WHEN (AmountOwing = 0) THEN 
     -- DELETE STATEMENT 
    END 
END 
GO 
Смежные вопросы