Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 INSTEAD OFF  [new]
Местный писатель
Member

Откуда: СССР
Сообщений: 198
Кто обьяснит почему так:

IF EXISTS (SELECT name 
	   FROM   sysobjects 
	   WHERE  name = N'tr_Empl' 
	   AND 	  type = 'TR')
    DROP TRIGGER tr_Empl
GO

IF EXISTS (SELECT TABLE_NAME 
	   FROM   INFORMATION_SCHEMA.VIEWS 
	   WHERE  TABLE_NAME = N'vEmployees')
    DROP VIEW vEmployees
GO

CREATE VIEW vEmployees AS
SELECT * FROM Northwind.dbo.Employees
GO

CREATE   TRIGGER tr_Empl
ON dbo.vEmployees 
INSTEAD OF DELETE
AS
BEGIN
	ROLLBACK TRANSACTION
	RAISERROR ('Нельзя удалить !',16,1)
END
GO

DELETE FROM vEmployees WHERE EmployeeID = 1

выдает :
Server: Msg 547, Level 16, State 1, Line 1
DELETE statement conflicted with COLUMN REFERENCE constraint 'FK_Orders_Employees'. 
The conflict occurred in database 'Northwind', table 'Orders', column 'EmployeeID'.
The statement has been terminated.

Понятно, что внешний ключ , но разве наличие INSTEAD OF DELETE тригерра никак не влияет на то ,что сервер пытается удалить запись с EmployeeID = 1 ??? Мне казалось , что должно только выскрчить месага : 'Нельзя удалить !',
а удалений никаких не должно произходить! Разве не так ???
19 авг 05, 18:08    [1804054]     Ответить | Цитировать Сообщить модератору
 Re: INSTEAD OFF  [new]
Roman S. Golubin
Member

Откуда: 140002
Сообщений: 11541

select USER у тебя что возвращает?

Попробуй вот так переписать:

IF EXISTS (SELECT TABLE_NAME
	   FROM   INFORMATION_SCHEMA.VIEWS
	   WHERE  TABLE_NAME = N'dbo.vEmployees')
    DROP VIEW vEmployees
GO

CREATE VIEW dbo.vEmployees AS
SELECT * FROM Northwind.dbo.Employees
GO

CREATE   TRIGGER tr_Empl
ON dbo.vEmployees
INSTEAD OF DELETE
AS
BEGIN
	ROLLBACK TRANSACTION
	RAISERROR ('Нельзя удалить !',16,1)
END
GO

DELETE FROM dbo.vEmployees WHERE EmployeeID = 1


Posted via ActualForum NNTP Server 1.2

19 авг 05, 18:37    [1804157]     Ответить | Цитировать Сообщить модератору
 Re: INSTEAD OFF  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
а так?
CREATE VIEW vEmployees AS with VIEW_METADATA 
SELECT * FROM Northwind.dbo.Employees
19 авг 05, 18:57    [1804211]     Ответить | Цитировать Сообщить модератору
 Re: INSTEAD OFF  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Хм... Это скрипт у меня успешно работает.

Microsoft SQL Server  2000 - 8.00.760 (Intel X86) 
	Dec 17 2002 14:22:05 
	Copyright (c) 1988-2003 Microsoft Corporation
	Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 2)

Вы часом не из EM пытаетесь запись из представления удалять?
22 авг 05, 07:27    [1805665]     Ответить | Цитировать Сообщить модератору
 Re: INSTEAD OFF  [new]
Местный писатель
Member

Откуда: СССР
Сообщений: 198
Roman S. Golubin

select USER у тебя что возвращает?

Попробуй вот так переписать:

IF EXISTS (SELECT TABLE_NAME
	   FROM   INFORMATION_SCHEMA.VIEWS
	   WHERE  TABLE_NAME = N'dbo.vEmployees')
    DROP VIEW vEmployees
GO

CREATE VIEW dbo.vEmployees AS
SELECT * FROM Northwind.dbo.Employees
GO

CREATE   TRIGGER tr_Empl
ON dbo.vEmployees
INSTEAD OF DELETE
AS
BEGIN
	ROLLBACK TRANSACTION
	RAISERROR ('Нельзя удалить !',16,1)
END
GO

DELETE FROM dbo.vEmployees WHERE EmployeeID = 1


Posted via ActualForum NNTP Server 1.2


Да так работает. Спасибо
22 авг 05, 10:53    [1806072]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить