powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запрет удаления строк из дочерней таблицы
7 сообщений из 7, страница 1 из 1
Запрет удаления строк из дочерней таблицы
    #34714371
dreel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть 2 связанные таблицы
1:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE [dbo].[nodes](
	[net_id] [int] NOT NULL,
	[node_id] [int] IDENTITY( 1 , 1 ) NOT NULL,
	[node_name] [varchar]( 255 ) NOT NULL,
	[node_type_id] [int] NOT NULL,
PRIMARY KEY CLUSTERED 
(
	[node_id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED 
(
	[node_name] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

2:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE [dbo].[sdh_mux_settings](
	[node_id] [int] NOT NULL,
	[nsap] [varchar]( 42 ) NOT NULL,
	[ip_address] [varchar]( 23 ) NOT NULL,
UNIQUE NONCLUSTERED 
(
	[ip_address] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
UNIQUE NONCLUSTERED 
(
	[nsap] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

-- FK
ALTER TABLE [dbo].[sdh_mux_settings]  WITH CHECK ADD  CONSTRAINT [FKsdh_mux_se43357] FOREIGN KEY([node_id])
REFERENCES [dbo].[nodes] ([node_id])
ON UPDATE CASCADE
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[sdh_mux_settings] CHECK CONSTRAINT [FKsdh_mux_se43357]

связь от [Nodes] (1-N) [sdh_mux_settings] по node_id.

FK с каскадом от родительской [Nodes] работает прекрасно.
Но мне надо бы еще защитить [sdh_mux_settings] от удаления строк,
иначе получается - ключ в Родительской есть, а в дочерней данных нет.

-----------------------
Как запретить удаление из дочерней таблицы. чтобы удаление напрямую было невозможно, а только через каскад из Родительской?
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34714423
dreel
Как запретить удаление из дочерней таблицы. чтобы удаление напрямую было невозможно, а только через каскад из Родительской?
Может не давать прав на удаление пользователю? ( REVOKE DELETE ON таблица FROM user )
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34714497
Фотография Сергей Васкецов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dreelКак запретить удаление из дочерней таблицы. чтобы удаление напрямую было невозможно, а только через каскад из Родительской?
В триггере на after delete в дочерней сделайте проверку, что запись в родительской таблице еще есть. Если записи уже нет - значит ее delete отработал и строки дочерней удаляются по каскаду. По крайней мере, если каскадное удаление сделано в триггере на родительской таблице, это будет работать, про FK не скажу точно.
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34714718
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Васкецов
В триггере на after delete в дочерней сделайте проверку, что запись в родительской таблице еще есть. Если записи уже нет - значит ее delete отработал и строки дочерней удаляются по каскаду. По крайней мере, если каскадное удаление сделано в триггере на родительской таблице, это будет работать, про FK не скажу точно. стало интересно, попробовал - работает на ура и с FK
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34714768
ModelR
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>иначе получается - ключ в Родительской есть, а в дочерней данных нет.

Т.е. в общем случае отбирать права удаления нельзя, а нужно проверять в что-то типа
Код: plaintext
1.
2.
3.
4.
5.
6.
select 
  case  (Select top  1   1 
      from  [dbo].[nodes] n
      where not exists (select  1  from [dbo].[sdh_mux_settings] s where n.[node_id] = s.[node_id]))
    when  1  then 'Проблема'
    else '!'
  end
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34715692
dreel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Точно!
Вы меня превосходно поняли!
Я сомневался, что с FK будет работать и даже не попробовал....

Спасибо - буду делать.

p/s/ - вкурил ))
...
Рейтинг: 0 / 0
Запрет удаления строк из дочерней таблицы
    #34715695
dreel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо товарищи: Сергей Васкецов, egorych, ModelR
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Запрет удаления строк из дочерней таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]