Как предотвратить обновление определенных строк в SQL Server 2012? - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь выполнить запрос, который не позволяет пользователю обновить определенные строки с условием. Я знаю, что это делается с помощью триггера, но я все еще новичок, и я не знаю, как и как активировать или вызвать этот триггер в формах c # windows.

Это моя таблица, например:

tbl_Products (prod_ID, prod_Name, Quantity, Price, Status)

Мое состояние будет, например, таким:

deny update tbl_products (prod_ID, prod_Name, Quantity, Price) where status = 'sold'

Пользователь сможет обновлять информацию о продукте только тогда, когда столбец статуса = «не продано»

Ответы [ 3 ]

2 голосов
/ 10 июня 2019

Я не знаю, как и как активировать или вызвать этот триггер в формах c # windows.

Вы не знаете;триггеры применяются на сервере базы данных и будут автоматически вызываться операторами UPDATE.Если вы создали триггер, который эффективно прерывает UPDATE, тогда ... Я думаю, это сработает.

Однако обычно вы просто (на уровне приложения) ... не делайтеt обновить строки, которые вы не хотите обновлять .

Другой вариант, для справки, по существу, состоит из двух таблиц - например, PENDING_PRODUCTS и SOLD_PRODUCTS - и затем REVOKE UPDATE ON SOLD_PRODUCTS (и, вероятно, DELETE тоже), так что вы можете INSERT только в него - и, возможно, создать VIEW (PRODUCTS), который является объединением двух с фиктивным столбцом состояния, который различает их.

1 голос
/ 10 июня 2019

Первое, что вы не можете явно вызвать или выполнить триггеры, триггеры вызываются автоматически.В вашем сценарии вы можете написать логику внутри триггера, чтобы он проверял условие и затем обновлял таблицу. https://docs.microsoft.com/en-us/sql/t-sql/statements/create-trigger-transact-sql?view=sql-server-2017 посетите эту ссылку для получения дополнительной информации о триггерах

0 голосов
/ 10 июня 2019

Если вы хотите пойти по маршруту триггера, вам нужно написать триггер примерно так:

CREATE TRIGGER StopUpdateSold
ON tbl_Prosucts
AFTER UPDATE
AS 
BEGIN
    IF EXISTS (SELECT 1 FROM deleted where status = 'sold')
    BEGIN
        RAISERROR ('You cannot update when Status is sold', 16, 1);
        ROLLBACK TRANSACTION;
        RETURN;
    END;
END;

Теперь, когда вы пытаетесь выполнить обновление из своего кода на C #, вам нужно будет отловить ошибку, возникшую в SQL Server. Как уже говорили другие, вы не вызываете триггер явно. Триггер срабатывает, когда происходит обновление, и откатывает обновление, если оно достигает условия, одновременно вызывая исключение, которое вы затем перехватываете, чтобы предоставить пользователю значимую информацию.

Лично я бы отключил функцию обновления в вашем коде c # для любой записи со статусом «продано». То есть У меня была бы бизнес-логика в приложении, а не в базе данных. Это не «жесткое и быстрое» правило: существуют случаи включения бизнес-логики с помощью триггеров, особенно когда пользователи получают доступ к базе данных различными способами.

...