SQL: строка “Защиты от записи” возможных данных?

Существует Атрибут типа , который позволяет Вам изменять стиль нумерации, однако, Вы не можете изменить точку после числа/буквы.

  1. Turn left on Maple Street
  2. Turn right on Clover Court

6
задан marc_s 27 October 2009 в 16:35
поделиться

6 ответов

Один из возможных подходов, который я когда-то использовал, описан в моем сообщении в блоге:

«Предположим, вам нужно обеспечить соблюдение следующего бизнес-правила: контракты не могут быть изменены после того, как вы начали над ними работать. (предположим, что этот конкретный бизнес работает в идеальном мире). Вы можете использовать столбец ROWVERSION, постоянный вычисляемый столбец и ограничение внешнего ключа для реализации этого правила - Использование ROWVERSION для обеспечения соблюдения бизнес-правил

1
ответ дан 17 December 2019 в 07:06
поделиться
  • Создайте вторую таблицу, содержащую строки с такими же уникальными идентификаторами, что и строки, которые вы пытаетесь защитить.

  • Разрешение этой ВТОРОЙ таблицы по своему усмотрению

  • Добавьте триггер для первой таблицы, который удалит / обновит обе таблицы, если соответствующая строка существует во второй таблице.

Таким образом, если у вас нет разрешения для второй таблицы, вы не сможете изменять «связанные» строки, так как триггер прекратит работу из-за нарушения прав доступа во второй таблице

ПРИМЕЧАНИЕ. с другими основными методами (с использованием представлений) заключается в том, что он позволяет легко поддерживать набор «фиксированных» строк в отличие от подхода VIEW и позволяет избежать различных проблем производительности, обычно связанных с представлениями.

0
ответ дан 17 December 2019 в 07:06
поделиться

Do this by relational integrity - do NOT use triggers as they're always a real pain to maintain afterwards (they have their place, just not here). Relation integrity will do everything you need.

Using relational integrity can be quite elegent, but what you need to do is slightly counter-intuitive so easily missed.

Create your main table table, tblMain, with a numeric primary key. For simplicity I tested this with a table with one column, intID, and I populated it with values 0,1 and 2.

Next create a second table, tblGuard, with a similar numeric primary key. I added one row into this table, value 1.

Now the reverse logic bit. Create a foreign key on the tblGuard table that reference the tblMain table

ALTER TABLE [dbo].[tblGuard] ADD 
    CONSTRAINT [FK_tblGuard_tblMain] FOREIGN KEY 
    (
        [intID]
    ) REFERENCES [dbo].[tblMain] (
        [intID]
    )

The constraint will ensure that the row with intID value 1 cannot be deleted from the tblMain table because the tblGuard table referential integrity requires that the value 1 exists in tblMain. This works with deletes and truncates.

2
ответ дан 17 December 2019 в 07:06
поделиться

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

1
ответ дан 17 December 2019 в 07:06
поделиться

Допустим, ваша MyTable находится на первичном.

Поместите первую строку в новую таблицу MyTableReadOnly, переместите эту таблицу в ее собственную файловую группу и сделайте файловую группу доступной только для чтения.

Удалите первую строку из MyTable

Теперь создайте представление, которое

SELECT Columns From MyTableNew
UNION
SELECT Columns From MyTable

Доступ ко всему через представление. Если вы хотите обновить или удалить из представления, вы можете сделать это в MyTable и игнорировать все для MyTableNew. Если вы хотите работать с представлением, вы можете использовать триггеры INSTEAD-OF .

0
ответ дан 17 December 2019 в 07:06
поделиться

Я говорю делать это "программно". Например, пусть строка с идентификатором 1 всегда будет строкой по умолчанию, затем добавьте ко всем запросам UPDATE или DELETE «WHERE id! = 1» или сделайте эквивалент на любом языке, который вы используете для написания своей логики (PHP, C, VB, и т. д.)

0
ответ дан 17 December 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: