[A] – Table Schema
to be needed
If not exists(Select 1 from sysobjects where
Xtype = 'U' and Name = 'DB_Owner_Mapping')
Begin
CREATE TABLE [dbo].[DB_Owner_Mapping](
[DBName] [nvarchar](255) NULL,
[Team] [nvarchar](255) NULL,
[Reporting_Officer] [nvarchar](255) NULL,
[RO_Display_Name] [nvarchar](255) NULL,
[RO Email Id] [nvarchar](255) NULL,
[DBA_Mapping_Name] [nvarchar](255) NULL,
[DBA_Mapping_email] [nvarchar](255) NULL
) ON [PRIMARY]
End
If not exists(Select 1 from sysobjects where
Xtype = 'U' and Name = 'User_Master')
Begin
CREATE TABLE [dbo].[User_Master](
[Rowid] [int] IDENTITY(1,1) NOT NULL,
[User_Id] [varchar](50) NULL,
[User_Name] [varchar](100) NULL,
[Team] [varchar](100) NULL,
[Reporting_Officer] [varchar](100) NULL,
[Account_Type] [varchar](50) NULL,
[Mod_Date] [datetime] NULL,
[User_Status] [varchar](100) NULL,
[Email_id] [varchar](255) NULL,
[User_Alias] [varchar](255) NULL,
[TL] [varchar](100) NULL,
[Resigned_Status] [bit] Default(0),
CONSTRAINT
[PK__User_Mas__FFE968E92AC04CAA] PRIMARY KEY CLUSTERED
(
[Rowid] ASC
)WITH
(PAD_INDEX
= OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS
= ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
End
[B] – SP for extracting user details
-- SP Detail :
List of users from all databases
--
======================================================================
-- Exec
USP_UserList_All_DB 'ALL'
-- Exec
USP_UserList_All_DB 'Login id'
Create Proc [dbo].[USP_UserList_All_DB]
(
@UserName Varchar(100)
)
As
BEGIN
If not exists(Select 1 from sysobjects where
Xtype = 'U' and Name = 'User_Details')
Begin
CREATE TABLE [dbo].[User_Details](
[DBName] [nvarchar](128) NULL,
[DATABASE_ROLE] [sysname] NOT NULL,
[DATABASE_USER] [sysname] NOT NULL,
[TYPE_DESC] [nvarchar](60) NULL,
[CREATE_DATE] [datetime] NOT NULL,
[Timestamp] datetime
Default(Getdate())
) ON [PRIMARY]
End
Truncate table User_Details
DECLARE @command varchar(8000)
SELECT @command = 'USE [?] INSERT INTO
[DBA_ADMIN].[dbo].[User_Details]
([DBName]
,[DATABASE_ROLE]
,[DATABASE_USER]
,[TYPE_DESC]
,[CREATE_DATE])
SELECT DB_NAME()
As DBName,rp.NAME AS DATABASE_ROLE, mp.NAME AS DATABASE_USER,
mp.TYPE_DESC,mp.CREATE_DATE
from
sys.database_role_members drm
join sys.database_principals rp on
(drm.role_principal_id = rp.principal_id)
join sys.database_principals mp on
(drm.member_principal_id = mp.principal_id)
order by
rp.name '
EXEC sp_MSforeachdb @command
If (ISNULL(@UserName,'')=''OR @UserName = 'ALL')
Select * from [User_Details]
Order By
DATABASE_USER,Database_Role
Else
Select * from [User_Details]
Where DATABASE_USER =
@UserName Order By
DBName,DATABASE_USER,Database_Role
END
Print 'Select * from [User_Details] Order By
DATABASE_USER,Database_Role '
[C] – SQL Job for notification
Step-I- Call above SP
Exec
USP_UserList_All_DB 'ALL'
Step-II
– Notification code
Declare @SR_No Int, @SR_No2 Int, @DBName Varchar(100),@Team Varchar(100),@Reporting_Officer
Varchar(100),@RO_Display_Name Varchar(100),@RO_Email_Id Varchar(100),@DBA_Mapping_Name Varchar(100),@DBA_Mapping_email
Varchar(100)
Declare
@DATABASE_ROLE Varchar(100),@DATABASE_USER Varchar(100),@TYPE_DESC Varchar(100),@CREATE_DATE Datetime
SET NOCOUNT ON
-- Notification
pattern
Declare @Head_Cl Varchar(10),@Grid_Cl_En Varchar(10),@Grid_Cl_Od Varchar(10),@Grid_Cl_Sc Varchar(10),@Grid_Cl_Fl Varchar(10),@Used Int, @Free Int,@Used_Space Int
Select @Head_Cl = Header_Color,@Grid_Cl_En
= Grid_Color_Even,@Grid_Cl_Od
= Grid_Color_Odd,@Grid_Cl_Sc
= Success,@Grid_Cl_Fl
= Failed
From dbo.Notification_Color_Pattern
Where Month_Id = DATEPART(M,GETDATE())
Declare
@profile_name_P Varchar(100)
Select
@profile_name_P =
Name from Vw_DB_Profile
Declare @Body1 Varchar(MAX),@Subj Varchar(500),@Server Varchar(100),@Clr bit, @T_Head Varchar(MAX)
Declare @Today Date, @Rank Tinyint ,@Reporting_Officer_Main
Varchar(255),@RO_Name_Main Varchar(255),@Team_Main Varchar(255)
Select @Today = CONVERT(Date,Getdate())
Set @T_Head = ''
Set @T_Head = @T_Head + '<table border=4 ><tr><td bgcolor="'+Convert(Varchar(20),@Head_Cl)+'"><b><font
face="Calibri"><font style="font-size:
11pt;"><font color="#F5FFFA">'
Set @T_Head= @T_Head+'DATABASE_USER '+'</font></font></b></td>'
Set @T_Head= @T_Head+'<td bgcolor="'+Convert(Varchar(20),@Head_Cl)+'"><b><font
face="Calibri"><font style="font-size:
11pt;"><font color="#F5FFFA">'+'DATABASE_ROLE '+'</b></font></font></td>'
Set @T_Head= @T_Head+'<td bgcolor="'+Convert(Varchar(20),@Head_Cl)+'"><b><font
face="Calibri"><font style="font-size:
11pt;"><font color="#F5FFFA">'+'TYPE_DESC '+'</b></font></font></td>'
Set @T_Head= @T_Head+'<td bgcolor="'+Convert(Varchar(20),@Head_Cl)+'"><b><font face="Calibri"><font
style="font-size: 11pt;"><font color="#F5FFFA">'+'CREATE_DATE '+'</b></font></font></td>'
Set @T_Head= @T_Head+'<td bgcolor="'+Convert(Varchar(20),@Head_Cl)+'"><b><font
face="Calibri"><font style="font-size:
11pt;"><font color="#F5FFFA">'+'REMOVE/RETAIN? '+'</b></font></font></td></tr>'
--
==================== ==================== ====================
====================
--
==================== S T A R T M A I
N C U R S O R ====================
--
==================== ==================== ====================
====================
Declare CRSR_MAIN Cursor for
Select Distinct [Reporting_Officer],
[RO_Display_Name],[Team], [RO Email Id],
[DBA_Mapping_Name], [DBA_Mapping_email]+'' FROM
DB_Owner_Mapping
open CRSR_MAIN
Fetch next from CRSR_MAIN INTO @Reporting_Officer_Main,
@RO_Name_Main, @Team_Main, @RO_Email_Id, @DBA_Mapping_Name,
@DBA_Mapping_email
while @@Fetch_Status=0
BEGIN
Select @Subj = '',@Body1 = ''
Select @Subj = 'QUARTELY U?E? VALIDATION'+' ('+UPPER(Convert(Varchar(100),@Team_Main))+') - '+'Q'+Convert(char(1),datepart(qq,GETDATE()))+'-'+Convert(char(4),Year(Getdate()))
Select @Body1 = '<body
style="background-color:powderblue;"><td><font face="Calibri"><font
color="#2471A3"><font style="font-size: 11pt;">Hi
'+Convert(Varchar(15),@RO_Name_Main)+',</font></font></font></td><br></tr>'
Select @Body1 = @Body1 + '<td><font face="Calibri"><font
color="#2471A3"><font style="font-size: 11pt;">Following
are the list of ???? having access on following databases on server <b>'+Convert(Varchar(100),@@SERVERNAME)+'</b>
</font></font></font></td><br>'
Select @Body1 = @Body1+'<br><font
color="#1A5276"><td><font
face="Calibri"><font style="font-size: 15pt;"><b>'+UPPER(Convert(Varchar(100),@Team_Main))+' DB
LIST:</b></font></font></font></td></tr><br>'
-- ==================== S T A R
T S U B C U R S O R
N O 2 ====================
Declare CRSR_NO_2 Cursor for
Select Row_number() Over(order by [DBName]) As [SR_NO],[DBName], [Team],
[Reporting_Officer]
FROM DB_Owner_Mapping
Where [Reporting_Officer] =
@Reporting_Officer_Main
And [DBName] In(Select Distinct
[DBName] FROM dbo.User_Details
A
Where DATABASE_USER Not
In('dbo') And Left(DATABASE_USER ,2) != '##' And DATABASE_ROLE
!= 'DDL_Track')
And [DBName] Not In('master','msdb','model','ReportServer','ReportServerTempDB')
open CRSR_NO_2
Fetch next from CRSR_NO_2 INTO @SR_No,@DBName, @Team,
@Reporting_Officer
while @@Fetch_Status=0
BEGIN
Select @Body1
= @Body1+'<br><font
color="#1A5276"><td><font
face="Calibri"><font style="font-size:
15pt;"><b>'+Convert(Varchar(100),@SR_No)+' - '+ UPPER(Convert(Varchar(100),@DBName))+'</b></font></font></font></td></tr><br>'
Select @Body1
= @Body1+@T_Head
--
==================== S T A R T S U
B C U R S O R 3 ====================
Declare
CRSR__SUB_User Cursor for
Select
Row_number()
Over(order by
[DATABASE_USER],[DATABASE_ROLE]) As [SR_NO], [DATABASE_ROLE]
,
Case
when Isnull(B.Account_Type,'') = 'Service Account' Then
[DATABASE_USER]+'<b><font
color="Green"> (Service Account)</font></b>'
--when
Isnull(B.User_Alias,'')='' Then [DATABASE_USER]
When
Isnull(B.User_Alias,'') != '' And [DATABASE_USER] not
like '%'+B.User_Alias And B.Resigned_Status = 1 Then [DATABASE_USER]+' (<b>'+B.User_Alias+'</b>) - RESIGNED'
When
Isnull(B.User_Alias,'') != '' And [DATABASE_USER] not
like '%'+B.User_Alias And B.Resigned_Status = 0 Then [DATABASE_USER]+' (<b>'+B.User_Alias+'</b>)'
Else
[DATABASE_USER] END aS
[DATABASE_USER], [TYPE_DESC], [CREATE_DATE]
FROM
dbo.User_Details A Left
Join dbo.User_Master
B
On
A.DATABASE_USER =
B.[User_Id]
Where
[DBName] = @DBName
And DATABASE_USER Not
In('dbo')
And DATABASE_USER Not
like '%AUTHORITY\ANONYMOUS%'
And
Left(DATABASE_USER ,2) != '##'
And
DATABASE_ROLE != 'DDL_Track'
Order
By [DATABASE_USER],[DATABASE_ROLE]
open
CRSR__SUB_User
Fetch next from
CRSR__SUB_User INTO @SR_No2,@DATABASE_ROLE,
@DATABASE_USER,@TYPE_DESC, @CREATE_DATE
while
@@Fetch_Status=0
BEGIN
If (@SR_No2%2 = 0)
Begin
If (@DATABASE_USER Like '%RESIGNED')
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font
color="red"><font face="Calibri"><font
style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_USER)+'</font></font></font></td>'
Else
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_USER)+'</font></font></td>'
If (@DATABASE_ROLE = 'db_datawriter' OR
@DATABASE_ROLE = 'db_ddladmin'
OR @DATABASE_ROLE =
'db_owner')
Set @Body1 = @Body1 + '<td bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font color="red"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_ROLE)+'</font></font></font></td>'
Else
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_ROLE)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font face="Calibri"><font
style="font-size: 11pt;">'+Convert(Varchar(100),@TYPE_DESC)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@CREATE_DATE)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_En)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+SPACE(1)+'</font></font></td></tr>'
End
ELSE
Begin
If (@DATABASE_USER Like '%RE?IGNED')
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
color="red"><font face="Calibri"><font
style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_USER)+'</font></font></font></td>'
Else
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_USER)+'</font></font></td>'
If (@DATABASE_ROLE = 'db_datawriter' OR
@DATABASE_ROLE = 'db_ddladmin'
OR @DATABASE_ROLE =
'db_owner')
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
color="red"><font face="Calibri"><font
style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_ROLE)+'</font></font></font></td>'
Else
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@DATABASE_ROLE)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+Convert(Varchar(100),@TYPE_DESC)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font face="Calibri"><font
style="font-size: 11pt;">'+Convert(Varchar(100),@CREATE_DATE)+'</font></font></td>'
Set
@Body1 =
@Body1 + '<td
bgcolor="'+Convert(Varchar(20),@Grid_Cl_od)+'"><font
face="Calibri"><font style="font-size: 11pt;">'+SPACE(1)+'</font></font></td></tr>'
End
Fetch
next from
CRSR__SUB_User INTO @SR_No2,@DATABASE_ROLE,
@DATABASE_USER,@TYPE_DESC, @CREATE_DATE
END
CLOSE
CRSR__SUB_User
DEALLOCATE
CRSR__SUB_User
--
==================== S T O P S U B C U R S O R 3 ====================
Select @Body1
= @Body1+'</table><br>'
--Fetch next from
CRSR_NO_2 INTO @SR_No, @DBName, @Team, @Reporting_Officer, @RO_Display_Name,
@RO_Email_Id, @DBA_Mapping_Name, @DBA_Mapping_email
Fetch next from CRSR_NO_2 INTO @SR_No,@DBName, @Team,
@Reporting_Officer
END
CLOSE CRSR_NO_2
DEALLOCATE CRSR_NO_2
-- ==================== S T O
P S U B C U R S O R N O 2 ====================
--Instruction
Select @Body1
= @Body1+'<br><font
color="#1A5276"><td><font
face="Calibri"><font style="font-size:
11pt;"><b>Action Item for Application
team</b></font></font></font></td></tr><br>'
Select @Body1
= @Body1+'<td><font color="#2471A3"><font face="Calibri"><font
style="font-size: 11pt;"Please provide your input in
column(Remove/Retain?) wherever you need
changes.</font></font></font></td></tr>'
Select @Body1
= @Body1+'<td><font color="#2471A3"><font
face="Calibri"><font style="font-size: 11pt;">If
you are not the right person to revert on this email then please include the
relevent person who can revert and
confirm.</font></font></td></tr><br>'
Select @Body1
= @Body1+'<br><td><font
color="#1A5276"><font face="Calibri"><font
style="font-size: 11pt;"><b>Action Item for DB? team ('+CONVERT(Varchar(100),@DBA_Mapping_Name)+')</b></font></font></font></td></tr><br>'
Select @Body1
= @Body1+'<td><font color="#2471A3"><font
face="Calibri"><font style="font-size:
11pt;">Please do the timely follow-up on this email and make this task
closed.</font></font></td></tr><br>'
Select @Body1
= @Body1+'<br><br><td><font
color="#1A5276"><font face="Calibri"><font
style="font-size: 11pt;">Thanks & Regards,</font></font></font></td><br><br></tr>'
Select @Body1
= @Body1+'<td><b><font
color="#1A5276"><font face="Calibri"><font
style="font-size: 11pt;">DBA
Team</font></font></font></b></td><br></tr>'
Select @Body1
= @Body1+'<br><br>'
Select @Body1
= @Body1+'<td><b><font
color="red"><font face="Calibri"><font
style="font-size: 11pt;">Note : System generated mail, you can
revert back to DBA team.</font></font></font></b></td></tr> '
Select @Body1
= @Body1+'</body>'
EXEC msdb.dbo.sp_send_dbmail
@profile_name = @profile_name_P,
@recipients=@RO_Email_Id,
@copy_recipients =@DBA_Mapping_email,
@subject = @Subj,
@body = @Body1,
@body_format = 'HTML'
Fetch next from CRSR_MAIN INTO @Reporting_Officer_Main,
@RO_Name_Main, @Team_Main, @RO_Email_Id, @DBA_Mapping_Name,
@DBA_Mapping_email
END
CLOSE CRSR_MAIN
DEALLOCATE CRSR_MAIN
--
==================== ==================== ====================
====================
--
==================== S T O P M A I
N C U R S O R ====================
--
==================== ==================== ====================
====================
Long Term Notifications
[A] – Table Schema to be needed
CREATE TABLE [dbo].[Long_Term_Scheduled_Job](
[Jobid] [int] IDENTITY(1,1) Primary Key,
[Job_Name] [varchar](100) NULL,
[Subject] [varchar](255) NULL,
[Body] [varchar](8000) NULL,
[Email_Id] [varchar](255) NULL,
[Cc] [varchar](255) NULL,
[Bcc] [varchar](255) NULL,
[Scheduled_Date] [date] NULL,
[Create_Date] [datetime] DEFAULT (getdate()),
[Execution_Date] [datetime] NULL
) ON [PRIMARY]
GO
INSERT INTO [dbo].[Long_Term_Scheduled_Job]
([Job_Name]
,[Subject]
,[Body]
,[Email_Id]
,[Cc]
,[Bcc]
,[Scheduled_Date]
,[Create_Date]
,[Execution_Date])
Select
'Quartely
u??? validation'
,'Quartely u??? validation'
,'Hi Team,<br>As per the ????? <b>abc </b>,
kindly generate the u??? details and share the details with application.Once
you will get the final list from manager, remove the unwanted access from the
databases.<br><br><b>Note</b>:-Execute the following
query to generate the report.<br><font color="blue"><b>Use
?? <br>Go<br>Exec USP_u???List_All_DB
"ALL"</b></font>'
,Email_Id
,Cc
,Bcc
,Scheduled_Date
,Getdate()
,Execution_Date
from dbo.Long_Term_Scheduled_Job
Where Job_Name = '??'
And
Scheduled_Date > Convert(date,GETDATE())
[B] – SP to send notification
Create Proc [dbo].[Long_Term_Scheduled_Job_Notif_Mail]
(
@profile_name_P Varchar(255),
@Recipient_List Varchar(1000)
)
As
Declare @Today Date
Select @Today = CONVERT(Date,Getdate())
If exists(Select Top 1
[Scheduled_Date] from Long_Term_Scheduled_Job Where [Scheduled_Date] =
@Today)
Begin
Declare @Body_Tb Varchar(MAX),@Subj_Tb Varchar(8000),@Email Varchar(500),@CC Varchar(500)
Select @Body_Tb =
[Body],@Subj_Tb =
[Subject]
from
Long_Term_Scheduled_Job Where [Scheduled_Date] = @Today
Declare @Body1 Varchar(MAX),@Subj Varchar(500)
Declare @SR_NO Int,@Category Varchar(255),@DB_Name Varchar(255),@Backup_File_Name Varchar(255),@Backup_Date Date,@Bkp_Size_MB numeric(10,2),@Backup_Status Varchar(255)
Declare
CRSR_SCH_Mail Cursor for
Select [Body],[Subject],[Email_Id],CC from Long_Term_Scheduled_Job Where
[Scheduled_Date] = @Today
open
CRSR_SCH_Mail
Fetch next from
CRSR_SCH_Mail INTO @Body_Tb,@Subj_Tb,@Email,@CC
while @@Fetch_Status=0
BEGIN
Select @Subj = @Subj_Tb
Select @Body1 = ''
Select @Body1 = @Body1 + '<td><font face="Calibri"><font
color="#2471A3"><font style="font-size: 11pt;">'+@Body_Tb+'
</font></font></font></td><br>'
Select @Body1 = @Body1+'<br><br><td><font
color="#2471A3"><font face="Calibri"><font
style="font-size: 11pt;">Thanks &
Regards,</font></font></font></td><br><br></tr>'
Select @Body1 = @Body1+'<td><b><font
color="#2471A3"><font face="Calibri"><font
style="font-size: 11pt;">???
Team</font></font></font></b></td><br></tr>'
Select @Body1 = @Body1+'<br><br><br><br>'
Select @Body1 = @Body1+'<td><b><font
color="Blue"><font face="Calibri"><font
style="font-size: 11pt;">Note : System generated mail, For any
concern revert back to ??? team (????? ).</font></font></font></b></td></tr>'
Print 'Notification code'
EXEC msdb.dbo.sp_send_dbmail
@profile_name
= @profile_name_P,
@recipients=
@Email,
@copy_recipients =@CC,
@subject =
@Subj,
@body =
@Body1,
@body_format =
'HTML'
Fetch next
from CRSR_SCH_Mail INTO
@Body_Tb,@Subj_Tb,@Email,@CC
END
CLOSE
CRSR_SCH_Mail
DEALLOCATE
CRSR_SCH_Mail
End
System Proc for File purge
Declare @Dt Date
Select @Dt = DATEADD(day,-8,Getdate())
EXECUTE MASTER.dbo.xp_delete_file 0,
N'E:\backup_Test\Test_Folder\',N'bak',@Dt
16down voteaccepted
Xp_delete_file take
five parameters:
1. File Type = 0 for
backup files or 1 for report files.
2. Folder Path = The
folder to delete files. The path must end with a backslash "\".
3. File Extension = This
could be 'BAK' or 'TRN' or whatever you normally use.
4. Date = The cutoff
date for what files need to be deleted.
5. Subfolder = 0 to
ignore subfolders, 1 to delete files in subfolders.
Note:-In SQL Server 2014 at least, the
second parameter (Folder Path) can be a specific filename, which results in
only that one file being removed, e.g.: EXEC master.dbo.xp_delete_file 0,
'C:\Backups\SomeDatabaseBackup.bak
SQL server Important Links
SQL SERVER 2008 MULTI-SITE CLUSTER ON WINDOWS SERVER 2008 R2
SQL Server always on architecture
No comments:
Post a Comment