Могу ли я заблокировать вставку во всю таблицу, используя триггер сервера для указанной базы данных

#sql #sql-server #sql-server-2008

#sql #sql-сервер #sql-server-2008

Вопрос:

Могу ли я заблокировать вставку во всю таблицу с помощью серверного триггера для указанной базы данных

Комментарии:

1. Слишком расплывчато, без объяснения того, зачем вам нужен А) триггер и б) текущие роли, процедур недостаточно для управления тем, что, если таковые имеются, вставлено в теоретическую таблицу.

Ответ №1:

Если вы хотите предотвратить вставку записей в любую таблицу, написав серверный триггер, то ответ — нет, это невозможно.

Серверные триггеры обрабатывают только DDL (СОЗДАНИЕ, ИЗМЕНЕНИЕ, УДАЛЕНИЕ …), а не DML (ВСТАВКА, ОБНОВЛЕНИЕ, УДАЛЕНИЕ):

https://msdn.microsoft.com/en-us/library/ms189799.aspx

Серверные триггеры:

 -- Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE,  
--  or UPDATE STATISTICS statement (DDL Trigger)  

CREATE TRIGGER trigger_name   
ON { ALL SERVER | DATABASE }   
[ WITH <ddl_trigger_option> [ ,...n ] ]  
{ FOR | AFTER } { event_type | event_group } [ ,...n ]  
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<ddl_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  



-- Trigger on a LOGON event (Logon Trigger)  

CREATE TRIGGER trigger_name   
ON ALL SERVER   
[ WITH <logon_trigger_option> [ ,...n ] ]  
{ FOR| AFTER } LOGON    
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }  

<logon_trigger_option> ::=  
    [ ENCRYPTION ]  
    [ EXECUTE AS Clause ]  
  

Комментарии:

1. Вам понадобится триггер для каждой таблицы