Может ли триггеры SQL Server предотвращать обновление записей и разрешать вставлять новые записи?Триггер для предотвращения обновлений, но допускает вставки
Спасибо, Przemek
Может ли триггеры SQL Server предотвращать обновление записей и разрешать вставлять новые записи?Триггер для предотвращения обновлений, но допускает вставки
Спасибо, Przemek
Чтобы предотвратить обновление на столе, вы можете использовать «ВМЕСТО UPDATE» Trriger вы можете проверить эту записку «https://msdn.microsoft.com/en-us/library/aa258254%28SQL.80%29.aspx?f=255&MSPPError=-2147217396»
Спасибо. Mohamed. Вопрос: как я могу разрешить вставки в такой триггер? –
вы можете разрешить вставку с использованием обычного разрешения «Грант» и управлять обновлениями с помощью этого триггера. –
Мне нужно больше разъяснений по поводу вашего дела, чтобы я мог получить лучшее решение для вас. –
Не может ли это быть достигнуто путем создания пользователя SQL Server, который имеет доступ к ВСТАВИТЬ на таблицах назначения, но не UPDATE доступа? Создание нового пользователя без каких-либо разрешений, а затем:
GRANT INSERT ON [blah] TO [user]
Признаюсь, мое знание SQL Server триггеры ограничено, но это, кажется, как она будет работать.
Я хотел бы отображать отдельные данные об ошибках, поэтому предпочтительно использовать триггер. –
Разрешения могут управлять прямым доступом к таблице не-привилегированными пользователями, но не будут препятствовать обновлениям через хранимые процедуры, если цепочка владения не будет прервана. –
Для расширения 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
Проблема, похоже, немного сложнее, чем я ожидал - я 'Создал новый поток для его покрытия: http://stackoverflow.com/questions/31219607/trigger-to-block-some-updates-and-allow-inserts –
, ограничивающего на основании разрешений, лучше всего. Это можно сделать с помощью триггеров, но есть накладные расходы. Не могли бы вы объяснить свой сценарий более подробно, возможно, есть лучший способ выполнить то, что вы хотите. – Greg
У меня есть таблица Customers (Id, Name, City, ValidFrom, ValidTo). Чтобы отслеживать изменения, я хочу разрешить изменения путем добавления новых записей, а не обновления текущего. –
Я вижу, так что если кто-то хочет выпустить обновление, что именно вы ожидаете? Вы хотите, чтобы ошибка была брошена? Вы хотите заменить обновление обновлением? – Greg