web-dev-qa-db-ja.com

データベースからファイルストリームを削除する

データベースからファイルストリームを削除しようとしているので、以下を実行する必要があります

以下を削除する方法を教えてください。

ALTER TABLE AMGR_Documents_Tbl ADD UId uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT( NEWID() );
ALTER TABLE AMGR_Documents_Tbl ADD CONSTRAINT AMGR_Documents_Tbl_UId_Unique UNIQUE( UId );`

次に、おそらく次のコードであるファイルストリームのない列を追加する必要があります:

ALTER TABLE AMGR_Letters_Tbl ADD TextCol1 varbinary( max );
Update [AMGR_Letters_Tbl]
SET TextCol1 = TextCol;
ALTER TABLE [AMGR_Letters_Tbl] DROP COLUMN TextCol;
/*Now i just rename the column*/

また、FTSインデックスを修正する必要があります(これは理解できません)。その後、次のようになります。

    IF 0 != INDEXPROPERTY( OBJECT_ID( 'AMGR_Letters_Tbl' ), 'Letters_Record_Id', 'IsFulltextKey' ) BEGIN
                EXEC sp_fulltext_table AMGR_Letters_Tbl, 'drop'
            END

/****** I need to fix filestream on both tables:  ******/
/****** This is what the whole thing looks like (for 2 tables):  ******/
IF @@VERSION NOT LIKE 'Microsoft SQL Server 2005%' AND ISNULL(SERVERPROPERTY ('FilestreamEffectiveLevel'),0) > 0 BEGIN
    if not exists   ( select name from syscolumns where id IN 
                ( select Id from sysobjects where id = object_id(N'[dbo].[AMGR_Letters_Tbl]') and OBJECTPROPERTY(id, N'IsUserTable') = 1
                ) AND name = 'UId' )
    BEGIN
        -- add unique ROWGUIDCOL column
        ALTER TABLE AMGR_Letters_Tbl ADD UId uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT( NEWID() );
        ALTER TABLE AMGR_Letters_Tbl ADD CONSTRAINT AMGR_Letters_Tbl_UId_Unique UNIQUE( UId );
        EXEC( 'ALTER TABLE AMGR_Letters_Tbl ADD TextCol1 varbinary( max ) FILESTREAM NULL' );
        -- will need to re-create FTS index after
        IF 0 != INDEXPROPERTY( OBJECT_ID( 'AMGR_Letters_Tbl' ), 'Letters_Record_Id', 'IsFulltextKey' ) BEGIN
            EXEC sp_fulltext_table AMGR_Letters_Tbl, 'drop'
        END
        EXEC( 'UPDATE AMGR_Letters_Tbl SET TextCol1 = TextCol;' );
        ALTER TABLE AMGR_Letters_Tbl DROP COLUMN TextCol;
        EXEC sp_rename 'AMGR_Letters_Tbl.TextCol1', 'TextCol', 'COLUMN';
        EXEC ('DBCC CLEANTABLE (0,''AMGR_Letters_Tbl'',1000) WITH NO_INFOMSGS;');
    END
END 
GO
------------------------------------------------------------

IF @@VERSION NOT LIKE 'Microsoft SQL Server 2005%' AND ISNULL(SERVERPROPERTY ('FilestreamEffectiveLevel'),0) > 0 BEGIN
    if not exists   ( select name from syscolumns where id IN 
                ( select Id from sysobjects where id = object_id(N'[dbo].[AMGR_Documents_Tbl]') and OBJECTPROPERTY(id, N'IsUserTable') = 1
                ) AND name = 'UId' )
    BEGIN
        -- add unique ROWGUIDCOL column
        ALTER TABLE AMGR_Documents_Tbl ADD UId uniqueidentifier ROWGUIDCOL NOT NULL DEFAULT( NEWID() );
        ALTER TABLE AMGR_Documents_Tbl ADD CONSTRAINT AMGR_Documents_Tbl_UId_Unique UNIQUE( UId );
        EXEC( 'ALTER TABLE AMGR_Documents_Tbl ADD Data1 varbinary( max ) FILESTREAM NULL' );
        -- will need to re-create FTS index after
        IF 0 != INDEXPROPERTY( OBJECT_ID( 'AMGR_Documents_Tbl' ), 'AMGR_Documents_Record_Id', 'IsFulltextKey' ) BEGIN
            EXEC sp_fulltext_table AMGR_Documents_Tbl, 'drop'
        END
        EXEC( 'UPDATE AMGR_Documents_Tbl SET Data1 = Data;' );
        ALTER TABLE AMGR_Documents_Tbl DROP COLUMN Data;
        EXEC sp_rename 'AMGR_Documents_Tbl.Data1', 'Data', 'COLUMN';
        EXEC ('DBCC CLEANTABLE (0,''AMGR_Documents_Tbl'',1000) WITH NO_INFOMSGS;');
    END
END 
GO
3
Allan Corda

FILESTREAM機能をデータベースから完全に削除するには、次の手順を実行する必要があります。

  • すべてのテーブルからすべてのFILESTREAM列を削除する
  • FILESTREAMファイルグループからテーブルの関連付けを解除する
  • すべてのFILESTREAMデータコンテナー(ファイルグループファイル-複数ある可能性があります)を削除します。
  • すべてのFILESTREAMファイルグループを削除します(複数ある場合があります)

ウォークスルー ここをクリックして、彼の手順に従ってください

別の注:FileStreamファイルにデータがある場合、それを削除することはできません。 sp_filestream_force_garbage_collection残念ながら、これは機能します> = SQL Server 2012
その修正については、次のことができます ここで全体を参照

それが機能しない場合。そのためのバックアップを作成してみてください。これがFileStreamファイルをクリアした方法です。

クリアされると、FileStream FileとFILESTREAMファイルグループを削除できます。

データベースのインデックスが非常に大きい場合は、関数とビューを確認する必要があります。 (そのバックアップを持っている)

2
Allan Corda