sqlserver批量修改數據庫對象的schema架構


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM