1

ユーザー ID が PK のテーブル 'user' があります。これを複数の既存テーブルの 2 つの列に FK として追加する必要があります。今のところ、各テーブルを次のように更新しています。仕方。

alter table table1
add foreign key(createdby) references users(id)
go
alter table table1
add foreign key(createdby) references users(id)
go

すべてのテーブルを一度に更新する簡単な方法はありますか。ありがとうございました。

4

3 に答える 3

1

おそらく、このようなものがうまくいくでしょう!

DECLARE @TableName AS NVARCHAR(128)
DECLARE @Schema AS NVARCHAR(128)
DECLARE @Modify AS INTEGER
DECLARE @Created AS INTEGER
DECLARE @sql1 as nvarchar(max)
DECLARE @sql2 as nvarchar(max)
DECLARE curs CURSOR FOR
SELECT
A.[name],
S.[name] as schemaname,
(SELECT 1 FROM sys.all_objects innero 
where innero.[name] = 'FK_ModifiedBy' 
AND innero.parent_object_id = a.[object_id]) as ModifiedBy,
(SELECT 1 FROM sys.all_objects innero 
where innero.[name] = 'FK_CreatedBy' 
AND innero.parent_object_id = a.[object_id]) as CreatedBy
FROM
    sys.all_objects A
INNER JOIN
sys.all_columns O ON
A.[object_id] = O.[object_id]
INNER JOIN
SYS.schemas S ON
A.[schema_id] = S.[schema_id]
WHERE
O.name = 'ModifiedBy'
OPEN curs
FETCH NEXT FROM curs
INTO @TableName, @Schema, @Modify, @Created
WHILE @@FETCH_STATUS = 0
BEGIN
IF @Modify IS NULL
BEGIN
set @sql1 = N'ALTER TABLE ' + @Schema + '.' + @TableName 
 + ' ADD CONSTRAINT FK_ModifiedBy FOREIGN KEY (ModifiedBy) 
REFERENCES ' + @Schema + '.Users(userid)'
exec SP_EXECUTESQL @sql1
END
IF @Created IS NULL
BEGIN
set @sql2 = N'ALTER TABLE ' + @Schema + '.' + @TableName 
+ ' ADD CONSTRAINT FK_CreatedBy FOREIGN KEY (createdby) 
REFERENCES ' + @Schema + '.Users(userid)'
exec SP_EXECUTESQL @sql2
END
FETCH NEXT FROM curs
INTO @TableName, @Schema, @Modify, @Created
END
CLOSE curs
DEALLOCATE curs



SQLのビルドアップでインデントがうまくいかなくて申し訳ありません。ここでうまくインデントするのは少し面倒です。一部のテーブルに他の 2 つの列の 1 つしかない場合は、おそらく少し調整が必要です。

于 2013-04-21T14:42:10.290 に答える
1

これは、構文と DDL の変更が異なる別のデータベース用ですが、構造は同じです。データ ディクショナリ テーブルをクエリし、実行する SQL ステートメントを返すカーソルを宣言してから、各ステートメントの実行中にカーソルを開いてループします。

DECLARE SQLStr SHORTSTRING(1000);
DECLARE NoDefaultsCursor CURSOR FOR
   SELECT 'ALTER TABLE "' || TABLE_NAME ||
          '" ALTER COLUMN "' || FIELD_NAME || '" SET DEFAULT ' ||
     CASE FIELD_TYPE_SQL
       WHEN 'INTEGER' THEN '0'
       WHEN 'BOOLEAN' THEN 'FALSE'
       WHEN 'SHORTSTRING' THEN ''''''
       WHEN 'CHARACTER VARYING' THEN ''''''
     END || ';' AS AddDefaultSQL
   FROM #FIELDS WHERE NOT FIELD_HASDEFAULT
     AND FIELD_TYPE_SQL IN
       ('INTEGER','BOOLEAN','SHORTSTRING','CHARACTER VARYING');
OPEN NoDefaultsCursor;
FETCH NEXT FROM NoDefaultsCursor INTO SQLStr;
WHILE @@FETCH_STATUS = 0 DO
    Execute Immediate SQLStr;
    FETCH NEXT FROM NoDefaultsCursor INTO SQLStr;
END WHILE;
CLOSE NoDefaultsCursor; 
于 2013-04-21T14:27:16.803 に答える