글쎄, 난 멈출 때마다 전자 메일을 전송하고 백업 루틴을 확인하고 작업을 만드는거야하위 쿼리는 SQL Server의 1 개 이상의 값을 반환 2,005 트리거 [2]
(I가 유용하게 희망 다른 사람에게).
select name as "Nome da Base" , 'L' as Tipo from sys.sysdatabases a
where name not in ('master','tempdb','model'))
except
(select b.database_name, b.type from msdb..backupset b
where b.backup_start_date >= DATEADD (hour,-2, GETDATE())
and type='L')
union all
(select name as "Nome da Base", 'D' as Tipo from sys.sysdatabases a
where name not in ('tempdb','model'))
except
(select b.database_name, b.type from msdb..backupset b
where b.backup_start_date >= DATEADD (day,-1, GETDATE())
and type='D'
2) 작성 :
1) 나는 DB_NAME 및 일정 기간 내에 백업되지었던 backup_type을 반환하는 쿼리를 생성 : 내가 뭘하는 방식이기
CREATE TABLE [dbo].[Alerta_Log_Bkp](
[Nome da Base] [nvarchar](50) NULL,
[Tipo] [nvarchar](8) NULL,
[Servidor] [nvarchar](10) NULL,
[Hora Verificação] [datetime] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Alerta_Log_Bkp] ADD CONSTRAINT [DF_Alerta_Log_Bkp_Servidor]
DEFAULT (N'Server_NAME') FOR [Servidor]
GO
ALTER TABLE [dbo].[Alerta_Log_Bkp] ADD CONSTRAINT [DF_Alerta_Log_Bkp_Último Backup]
DEFAULT (getdate()) FOR [Hora Verificação]
GO
3) 삽입을 선택하여 작업을 만든 :
테이블 위의 쿼리의 반환 행을 기록하는INSERT INTO [dbo].[Alerta_Log_Bkp]
([Nome da Base],[Tipo])
(select name as "Nome da Base" , 'L' as Tipo from sys.sysdatabases a
where name not in ('master','tempdb','model','BA_CMA_OM'))
except
(select b.database_name, b.type from msdb..backupset b
where b.backup_start_date >= DATEADD (hour,-2, GETDATE())
and type='L')
union all
(select name as "Nome da Base", 'D' as Tipo from sys.sysdatabases a
where name not in ('tempdb','model'))
except
(select b.database_name, b.type from msdb..backupset b
where b.backup_start_date >= DATEADD (day,-1, GETDATE())
and type='D')
GO
->이 시점까지는 괜찮습니다.
내 문제는 "Alerta_Log_Bkp"테이블에 라인이 삽입 될 때 전자 메일을 트리거하는 트리거를 만드는 데 있습니다. 삽입물을 1 행만 테스트하면 모든 것이 잘 동작합니다. 그러나 삽입에 두 개 이상의 행이 있으면 다음과 같은 오류 메시지가 나타납니다. "하위 쿼리가 두 개 이상의 값을 반환했습니다. 하위 쿼리가 허용되지 않습니다."
변수를 다음과 같이 설정했기 때문에 발생합니다. 선택 항목이 삽입되었습니다. 그러나 나는 다른 방법을 생각할 수 없다. 여기
트리거입니다 :Create TRIGGER [dbo].[TR_Alert_mail_BKP] ON [dbo].[Alerta_Log_Bkp] AFTER INSERT AS
DECLARE @base varchar(50)
DECLARE @tipo varchar(50)
DECLARE @servidor varchar(50)
DECLARE @last_bkp DATETIME
SET @base = (SELECT "Nome da Base" FROM inserted)
SET @tipo = (SELECT tipo FROM inserted)
SET @servidor = (SELECT Servidor FROM inserted)
create table #temp (base varchar(50),
tipo varchar(50),
servidor varchar(50))
insert into #temp values (@base,@tipo,@servidor)
SET @last_bkp = (Select MAX(backup_start_date) from msdb..backupset
Where database_name = (select base from #temp)
and type = (select tipo from #temp))
--SET @last_bkp = (Select MAX(backup_start_date) from msdb..backupset
-- Where database_name = @base and type = @tipo)
IF @tipo in ('D','L')
BEGIN
DECLARE @msg varchar(8000)
SET @msg = 'The "' [email protected] + '" from database "' + @base + '", of the server "'
+ @servidor + '", stoped at ' + CAST(@last_bkp as varchar(50)) +''
EXEC msdb.dbo.sp_send_dbmail
@recipients=N'[email protected]',
@body= @msg,
@subject = 'Problemas no Backup' ,
@profile_name = 'PROFILE'
END
사람이 방아쇠를 작성하는 또 다른 방법의 실마리가 있는가, 그래서 하위 쿼리 오류가 발생하지 않습니다?
덕분에, 파브
@ HLGEM의 조언에 따라 sp_send_dbmail이 비동기식 인 경우에도 트리거에서 전자 메일을 보내지 않으려는 이유는 다음 문서를 참조하십시오. http://sqlblog.com/blogs/aaron%5Fbertrand/ 보관/2009/10/12/나쁜 습관 - 킥 - 학대 - triggers.aspx –