私はERPのクリーンアップに取り組んでおり、未使用のユーザーとユーザーグループへの参照を削除する必要があります。外部キーの制約はたくさんあるので、すべての痕跡を本当に取り除くようにしたいのです!
特定の列名を持つデータベース内のすべてのテーブルを見つけるためのこの整然としたコードを見つけました。この場合、ユーザーグループを見てみましょう。
select table_name from information_schema.columns
where column_name = 'GROUP_ID'
結果を使用して、40以上のテーブルで未使用のIDを検索できます...しかし、これは面倒です。Unused_Group
したがって、これを自動化して、これらすべてのテーブルをループし、列内で見つかった行を削除するクエリを作成したいと思いGROUP_ID
ます。
何かを削除する前に、既存のデータを視覚化したいので、文字列連結を使用して次のようなものを作成し始めました。
declare @group varchar(50) = 'Unused_Group'
declare @table1 varchar(50) = 'TABLE1'
declare @table2 varchar(50) = 'TABLE2'
declare @tableX varchar(50) = 'TABLEX'
select @query1 = 'SELECT ''' + rtrim(@table1) + ''' as ''Table'', '''
+ rtrim(@group) + ''' = CASE WHEN EXISTS (SELECT GROUP_ID FROM ' + rtrim(@table1)
+ ' WHERE GROUP_ID = ''' + rtrim(@group) + ''') then ''MATCH'' else ''-'' end FROM '
+ rtrim(@table1)
select @query2 = [REPEAT FOR @table2 to @tableX]...
EXEC(@query1 + ' UNION ' + @query2 + ' UNION ' + @queryX)
これは私に結果を与えます:
TABLE1 | Match
TABLE2 | -
TABLEX | Match
これは私の目的のために機能し、他のコードを変更せずに任意のユーザーグループに対して実行できます。もちろんDELETE
、これらの同じテーブルから簡単に適応できますが、ユーザーとユーザーの間で処理する必要がある75程度のテーブルでは管理できません。グループ。
動的SQLでこのリンクに遭遇しました。これは、今のところ私を怖がらせるほど強力で密度が高いものです...しかし、解決策はどこかにあるのではないかと思います。
私はFOR()
JSや他の言語のループに非常に精通しており、これは適切に構造化された配列を備えた簡単なものですが、SQLではそれほど単純ではないようです(私はまだ学習中ですが、 FORおよびGOTOソリューションが利用可能です...)。理想的には、特定の列名を持つテーブルを検索するためにクエリを実行し、上記のように各テーブルをクエリし、一致するリストを吐き出してから、2番目の同様のスクリプトを実行して行を削除するスクリプトがあります。
誰かが私を正しい方向に向けるのを手伝ってもらえますか?