SQL Server數據庫有登錄名、用戶、架構、角色等概念,在此不重復解釋。
其中架構名,原則上是不允許修改的(重命名),但當特殊業務場景需要時,可以通過創建新架構名,然后批量修改對象的架構來實現。
-- ALTER SCHEMA 新架構 TRANSFER 舊架構.對象名稱
ALTER SCHEMA [LC019999] TRANSFER dbo.[TestTkk]
需要進行修改默認schema的數據庫對象有:表、視圖、函數、存儲過程,其他附屬對象跟隨父對象走,如主外鍵、約束、索引、默認值等
SELECT SCHEMA_NAME([SCHEMA_ID]) AS shemaName, *
FROM sys.objects
WHERE TYPE IN ('U', 'V', 'FN', 'P')
--AND SCHEMA_NAME([SCHEMA_ID]) = @old_schema
AND [OBJECT_ID] != OBJECT_ID('dbo.upx_changeSchema')
具體步驟如下:
1、先創建一個新的架構(登錄名、用戶、架構);2、將原架構下的數據庫對象批量改到新架構下;3、刪除原有架構
-- 創建服務器的login[登錄名],設置密碼、檢查策略,同時設置默認數據庫 CREATE LOGIN LC039999 WITH PASSWORD='aaaaaa', CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF, DEFAULT_DATABASE = [Northwind]; GO -- 給指定login[登錄名]設置服務器角色 ALTER SERVER ROLE [dbcreator] ADD MEMBER [LC039999]; GO USE [Northwind]; -- 在特定數據庫下創建用戶,綁定[登錄名],同時設置默認[schema] CREATE USER LC039999 FROM LOGIN LC039999 WITH DEFAULT_SCHEMA=LC039999; GO -- 給數據庫用戶設置數據庫角色 ALTER ROLE [db_owner] ADD MEMBER [LC039999]; GO -- 創建數據庫[schema],設置schema所有者為指定數據庫用戶 CREATE SCHEMA LC039999 AUTHORIZATION LC039999; GO
在業務庫執行如下SQL,可以創建批量修改schema的存儲過程。
創建完成后,執行該存儲過程即可批量修改。
建議:執行前做好數據庫備份。
/* 執行存儲過程的demo EXEC dbo.upx_changeSchema 'dbo', -- 舊schema名稱 'lc039999'; -- 新schema名稱 */ IF OBJECT_ID('dbo.upx_changeSchema') IS NOT NULL BEGIN DROP PROC dbo.upx_changeSchema; END; GO CREATE PROC dbo.upx_changeSchema(@old_schema VARCHAR(200), @new_schema VARCHAR(200)) AS BEGIN --declare @old_schema varchar(200) = 'dbo'; --declare @new_schema varchar(200) = 'dbo'; DECLARE @objName VARCHAR(200); DECLARE csr CURSOR FOR SELECT NAME FROM sys.objects WHERE TYPE IN ('U', 'V', 'FN', 'P') AND SCHEMA_NAME([SCHEMA_ID]) = @old_schema AND [OBJECT_ID] != OBJECT_ID('dbo.upx_changeSchema') OPEN csr FETCH NEXT FROM csr INTO @objName WHILE (@@FETCH_STATUS=0) BEGIN --PRINT 'ALTER SCHEMA ' + @new_schema + ' TRANSFER ' + @old_schema + '.' + @objName exec('ALTER SCHEMA ' + @new_schema + ' TRANSFER ' + @old_schema + '.' + @objName); FETCH NEXT FROM csr INTO @objName END CLOSE csr DEALLOCATE csr END;
最后,根據業務需要決定是否刪除原有的架構、用戶及登錄名。
注意:有嚴格的順序要求。
DROP SCHEMA LC029999; DROP USER LC029999; DROP LOGIN LC029999;