Yanıtlar:
Bir veritabanını bir örnekten ayırırsanız, dosyanın işletim sistemi düzeyinde silinmesi gerekir. Daha güvenli yaklaşım, veritabanını bırakmaktır.
Ne öneririm (Bu yedekleme sırasında hiçbir aktivite oluşmasını sağlayacaktır gibi) sonra salt okunur moduna koymak sonra veritabanının son bir yedek alıyor, daha sonra bir veritabanı bırak komutuyla sisteminizden kaldırmak .
Komutların tamamı aşağıdakine benzer:
-- Use master db to ensure you don't have an active connection to the db you wish to affect
USE [master]
GO
-- This will kill any active transactions, but will force the database into a Read-Only state
ALTER DATABASE [db_name] SET READ_ONLY WITH ROLLBACK IMMEDIATE
GO
BACKUP DATABASE [db_name] -- Fill in more options here or use the UI to take a backup if you chooose
GO
-- This will kick out all connections from the database allowing you to drop it.
ALTER DATABASE [db_name] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Drop the database (which automatically removes the files from the OS)
DROP DATABASE [db_name]
GO
Bundan sonra, veritabanına komut dosyası çalıştıran tüm İşleri aramak isteyeceksiniz. Ben sadece bir iş bir veritabanı (hepsi tanımlamak kolay değil) başvurabilir sayısız yolu olduğu gibi (daha sonra sen-ebilmek iş / komut dosyası) başarısız olduğunu görmek için beklemek öneririz.
Son olarak, yalnızca bu veritabanına erişimi olan tüm kullanıcıları örnekten kaldırmak istersiniz. Bu komut dosyası, bu kullanıcıların kim olduğunu tanımlamalı, ancak Max'in sürümü çok daha temiz (bunu eklemek için cevabımı düzenleyene kadar bir yaklaşım yayınladığını fark etmedim):
DECLARE @ExecString NVARCHAR (4000)
-- Create Empty Table in a very lazy manner
SELECT name, principal_id, CAST('' AS NVARCHAR(128)) as database_name
INTO ##tmp_AllDBUsers
FROM sys.server_principals
WHERE 1 = 2
-- Declare Cursor to iterate through all DBs on the instance
DECLARE dbCursor CURSOR
FOR
SELECT name
FROM sys .databases
DECLARE @name NVARCHAR (128)
OPEN dbCursor
FETCH NEXT FROM dbCursor
INTO @name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @ExecString =
'USE [' + @name + '];
INSERT INTO ##tmp_AllDBUsers
SELECT sp.name, sp.principal_id, DB_NAME()
FROM sys.server_principals sp INNER JOIN sys.database_principals dp
ON sp.sid = dp.sid'
EXEC(@ExecString)
FETCH NEXT FROM dbCursor
INTO @name
END
-- Close and deallocate the cursor because you've finished traversing all it's data
CLOSE dbCursor
DEALLOCATE dbCursor
-- Show all logins that do not belong to a server-level role nor have access to any databases
SELECT sp.*
FROM sys.server_principals sp LEFT JOIN ##tmp_AllDBUsers adu
ON sp.principal_id = adu.principal_id
WHERE adu.principal_id IS NULL
AND sp.principal_id NOT IN (SELECT member_principal_id
FROM sys.server_role_members)
AND TYPE IN ('S', 'U', 'G')
-- cleanup
DROP TABLE ##tmp_AllDBUsers
John'un cevabını iptal ettim; Temizlemek isteyebileceğiniz diğer öğeler hakkında bazı ayrıntılar eklemek istiyorum.
SQL Server Agent işleri ve uyarıları veritabanına başvurabilir. Bunların temizlenmesi gereksiz hataların bildirilmesini önleyecektir.
Veritabanı için özel olarak oluşturulmuş tüm Girişleri kaldırın. Aşağıdaki T-SQL, kullanılıp kullanılmadığını görmek için araştırabileceğiniz olası aday girişlerini tanımlar . Kod, herhangi bir veritabanı tarafından başvurulmayan oturum açma bilgilerini tanımlar.
DECLARE @cmd nvarchar(max);
SET @cmd = ' SELECT sp.sid
FROM master.sys.server_principals sp
';
SELECT @cmd = @cmd + ' EXCEPT
SELECT dp.sid
FROM ' + QUOTENAME(d.name) + '.sys.database_principals dp
'
FROM sys.databases d
WHERE d.[state] <> 6; --ignore offline DBs
SET @cmd = 'SELECT spr.*
FROM (
' + @cmd + '
) src
INNER JOIN master.sys.server_principals spr
ON src.sid = spr.sid
WHERE spr.type <> ''R''
AND spr.name NOT LIKE ''%##MS_%''
AND spr.name NOT LIKE ''NT %''
AND NOT EXISTS (
SELECT 1
FROM sys.server_role_members srm
WHERE srm.member_principal_id = spr.principal_id
)
ORDER BY spr.name;
';
EXEC sys.sp_executesql @cmd;
Bu veritabanı için yedekleme aygıtları bulunabilir. Bunları kaldırmak kesinlikle gerekli olmasa da, kullanılmıyorlarsa, gelecekteki olası karışıklığı ortadan kaldırmalıdırlar.
Sunucu düzeyi tetikleyiciler veritabanına başvurabilir.
Veritabanına başvuran bakım planlarına bakın - eksik veritabanını kaldırmak için güncellenmezlerse bunlar başarısız olur.
Tüm önemli noktalar zaten ele alınmıştır. Aşağıda benim 2 sentim:
Veritabanını sunucu içinde veya başka bir sunucuya taşımak için kullanılması amaçlandığından, bir veritabanının ayrılması asla kalıcı bir çözüm değildir. Bir veritabanının kalıcı olarak kaldırılması, SSMS'deki Sil seçeneği veya yukarıda belirtildiği gibi DROP veritabanı komutu ile yapılabilir.
Genellikle kasıtlı olarak çevrimdışı tutulan ve Uyarı oluşturmaya devam eden veritabanları, ayırdığımız ve kalıcı olarak kaldırılana (Silinene) kadar sakladığımız veritabanlarıdır.
Ön ayırma görevi: sp_helpdb dbname
Dosya konumlarını bilmek için çalıştırın .
Temizleme görevleri:
Girişler, Ajan İşleri, Tetikleyiciler ve Max tarafından daha önce bahsedilen noktalar dışında, bu 2'ye de bakılabilir.