Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
Лукьчнчук Анатолий
Member

Откуда: Москва
Сообщений: 68
Microsoft SQL Server 2008 (SP3) - 10.0.5500.0 (X64) 
	Sep 21 2011 22:45:45 
	Copyright (c) 1988-2008 Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (VM)


CREATE TABLE [dbo].[Demo_Login_Audit](
	[LoginName] [varchar](128) NULL,
	[auth_scheme] [varchar](128) NULL,
	[connect_time] [datetime] NULL,
	[net_transport] [varchar](128) NULL,
	[client_net_address] [varchar](128) NULL
) ON [PRIMARY]

GO

CREATE TABLE [dbo].[Demo_Login_Audit_Log](
	[LoginName] [varchar](128) NOT NULL,
	[auth_scheme] [varchar](128) NOT NULL,
	[connect_time] [smalldatetime] NOT NULL,
	[net_transport] [varchar](128) NOT NULL,
	[client_net_address] [varchar](128) NOT NULL
) ON [PRIMARY]

GO



	DELETE FROM [dbgeneral].[dbo].[Demo_Login_Audit]
	OUTPUT DELETED.* INTO [dbgeneral].[dbo].[Demo_Login_Audit_Log]

Не пойму как написать WITH (TABLOCK) для [Demo_Login_Audit_Log]. Это какое-то ограничение, или я неправильно пишу?
30 окт 13, 17:13    [15054461]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Лукьчнчук Анатолий
Не пойму как написать WITH (TABLOCK) для [Demo_Login_Audit_Log]
Никак.
30 окт 13, 17:20    [15054544]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
select from delete
Guest
CREATE TABLE #Demo_Login_Audit(
	[LoginName] [varchar](128) NULL,
	[auth_scheme] [varchar](128) NULL,
	[connect_time] [datetime] NULL,
	[net_transport] [varchar](128) NULL,
	[client_net_address] [varchar](128) NULL
) ON [PRIMARY]

GO

CREATE TABLE #Demo_Login_Audit_Log(
	[LoginName] [varchar](128) NOT NULL,
	[auth_scheme] [varchar](128) NOT NULL,
	[connect_time] [smalldatetime] NOT NULL,
	[net_transport] [varchar](128) NOT NULL,
	[client_net_address] [varchar](128) NOT NULL
) ON [PRIMARY]

GO


insert #Demo_Login_Audit_Log with (tablock)
select *
from (
	DELETE FROM #Demo_Login_Audit
	OUTPUT DELETED.* 
) a
30 окт 13, 17:23    [15054584]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
Гость333
Member

Откуда:
Сообщений: 3683
select from delete
insert #Demo_Login_Audit_Log with (tablock)
select *
from (
	DELETE FROM #Demo_Login_Audit
	OUTPUT DELETED.* 
) a

Только здесь есть ограничение — чтобы такая конструкция работала, на Demo_Login_Audit не должно быть триггеров на DELETE.
30 окт 13, 17:27    [15054621]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
select from delete
Guest
Гость333
select from delete
insert #Demo_Login_Audit_Log with (tablock)
select *
from (
	DELETE FROM #Demo_Login_Audit
	OUTPUT DELETED.* 
) a

Только здесь есть ограничение — чтобы такая конструкция работала, на Demo_Login_Audit не должно быть триггеров на DELETE.

а как это ограничение проявляется?

это работает
if object_id('dbo.Demo_Login_Audit') is not null
	drop table dbo.Demo_Login_Audit
go	
CREATE TABLE dbo.Demo_Login_Audit(
	[LoginName] [varchar](128) NULL,
	[auth_scheme] [varchar](128) NULL,
	[connect_time] [datetime] NULL,
	[net_transport] [varchar](128) NULL,
	[client_net_address] [varchar](128) NULL
) ON [PRIMARY]

GO
if object_id('dbo.Demo_Login_Audit_Log') is not null
	drop table dbo.Demo_Login_Audit_Log
go	
CREATE TABLE dbo.Demo_Login_Audit_Log(
	[LoginName] [varchar](128) NOT NULL,
	[auth_scheme] [varchar](128) NOT NULL,
	[connect_time] [smalldatetime] NOT NULL,
	[net_transport] [varchar](128) NOT NULL,
	[client_net_address] [varchar](128) NOT NULL
) ON [PRIMARY]

GO
create trigger trg_delete on dbo.Demo_Login_Audit
for delete
as
	select *
	from deleted
go

insert dbo.Demo_Login_Audit(
[LoginName] 
, [auth_scheme] 
, [connect_time] 
, [net_transport] 
, [client_net_address] 	
)
select 
'1'
, '1'
, getdate()
, '1'
, '1'
go

insert dbo.Demo_Login_Audit_Log with (tablock)
select *
from (
	DELETE FROM Demo_Login_Audit
	OUTPUT DELETED.* 
) a
go

select *
from dbo.Demo_Login_Audit_Log
30 окт 13, 17:36    [15054668]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
Лукьчнчук Анатолий
Member

Откуда: Москва
Сообщений: 68
select from delete,

Спасибо. Помогло.
30 окт 13, 17:42    [15054702]     Ответить | Цитировать Сообщить модератору
 Re: WITH (TABLOCK) c OUTPUT DELETED.* INTO  [new]
Гость333
Member

Откуда:
Сообщений: 3683
select from delete
это работает

Да, действительно работает.

Вот такая конструкция не работает:
	DELETE FROM Demo_Login_Audit
	OUTPUT DELETED.* 

Msg 334, Level 16, State 1, Line 2
The target table 'Demo_Login_Audit' of the DML statement cannot have any enabled triggers if the statement contains an OUTPUT clause without INTO clause.


Исходя из этого, я подумал, что и "insert ... select ... from (delete ... output deleted.*)" тоже не сработает. Теперь буду знать.
30 окт 13, 17:43    [15054719]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить