maby что-то вроде этого сделало бы трюк!
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 строить вверх, кажется немного громоздким, чтобы сделать это хорошо здесь. Для этого, вероятно, потребуется небольшая настройка, если в некоторых таблицах имеется только один из двух столбцов.
Если вы используете приложение, как ColdFusion, .net и т.д., и эти приложения имеют необходимые permisions, вы могли бы петли через список tablenames. –
Привет. Я использую sql server 2008 r2. Я могу получить имена tbl: "select table_name from information_schema.columns где column_name = 'createdby' и table_catalog = 'dbtables' .... но я не знаю, hw продолжить дальше – Ruby
Нет, нет более простого способа сделать это - если вы хотите добавить внешние ключи в 10 таблиц, вам нужно написать 10 команд 'ALTER TABLE'. –