2015-07-03 3 views
0

Может ли триггеры SQL Server предотвращать обновление записей и разрешать вставлять новые записи?Триггер для предотвращения обновлений, но допускает вставки

Спасибо, Przemek

+2

, ограничивающего на основании разрешений, лучше всего. Это можно сделать с помощью триггеров, но есть накладные расходы. Не могли бы вы объяснить свой сценарий более подробно, возможно, есть лучший способ выполнить то, что вы хотите. – Greg

+0

У меня есть таблица Customers (Id, Name, City, ValidFrom, ValidTo). Чтобы отслеживать изменения, я хочу разрешить изменения путем добавления новых записей, а не обновления текущего. –

+0

Я вижу, так что если кто-то хочет выпустить обновление, что именно вы ожидаете? Вы хотите, чтобы ошибка была брошена? Вы хотите заменить обновление обновлением? – Greg

ответ

0

Чтобы предотвратить обновление на столе, вы можете использовать «ВМЕСТО UPDATE» Trriger вы можете проверить эту записку «https://msdn.microsoft.com/en-us/library/aa258254%28SQL.80%29.aspx?f=255&MSPPError=-2147217396»

+0

Спасибо. Mohamed. Вопрос: как я могу разрешить вставки в такой триггер? –

+0

вы можете разрешить вставку с использованием обычного разрешения «Грант» и управлять обновлениями с помощью этого триггера. –

+0

Мне нужно больше разъяснений по поводу вашего дела, чтобы я мог получить лучшее решение для вас. –

1

Не может ли это быть достигнуто путем создания пользователя SQL Server, который имеет доступ к ВСТАВИТЬ на таблицах назначения, но не UPDATE доступа? Создание нового пользователя без каких-либо разрешений, а затем:

GRANT INSERT ON [blah] TO [user] 

Признаюсь, мое знание SQL Server триггеры ограничено, но это, кажется, как она будет работать.

+0

Я хотел бы отображать отдельные данные об ошибках, поэтому предпочтительно использовать триггер. –

+1

Разрешения могут управлять прямым доступом к таблице не-привилегированными пользователями, но не будут препятствовать обновлениям через хранимые процедуры, если цепочка владения не будет прервана. –

1

Для расширения INSTEAD OF UPDATE, этот триггер будет срабатывать для UPDATE команд. INSERT и DELETE команды работают как обычно; если вы хотите перехватить любой из них, вы должны использовать триггер INSTEAD OF INSERT или INSTEAD OF DELETE.

Полное решение выглядит примерно так:

CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE AS 
BEGIN 
    RAISERROR('myTable does not allow UPDATE queries.', 18, 0); 
END; 
GO 

Более подробную информацию о RAISERROR является here. В основном второй аргумент (18) - это серьезность, причем 18 - наивысшая степень серьезности, разрешенная для пользовательских исключений. Третий аргумент (0) - это «состояние», которое вам обычно не требуется, отсюда и нуль. более

один пример: если вы хотите, чтобы предотвратить UPDATEиDELETE, вы бы использовать что-то вроде этого:

CREATE TRIGGER myTable_IO_Upd ON myTable INSTEAD OF UPDATE, DELETE AS 
BEGIN 
    RAISERROR('myTable does not allow UPDATE or DELETE queries.', 18, 0); 
END; 
GO 
+0

Проблема, похоже, немного сложнее, чем я ожидал - я 'Создал новый поток для его покрытия: http://stackoverflow.com/questions/31219607/trigger-to-block-some-updates-and-allow-inserts –