2012-02-17 2 views
1

Я могу получить код хранимой процедуры, используя таблицу syscomments.SQL Server Как я могу получить код ограничения внешнего ключа

select so.name, sc.text as storedproccode 
from sysobjects so (nolock) 
inner join syscomments sc (nolock) on sc.id = so.id 
where so.name = 'tablename' 

Как получить код для ограничения внешнего ключа? У меня есть имя внешнего ключа.

Позвольте мне уточнить, что я ищу.

Я нахожу свою таблицу в Обозревателе объектов и разворачиваю список ключей. Если есть первичный ключ, я могу щелкнуть правой кнопкой мыши по ограничению первичного ключа и открыть сценарий в новом окне.

код выглядит следующим образом:

USE [Gemini] 
GO 
/****** Object: Index [PK_CM_FULFILLMENT_HISTORY] Script Date: 02/17/2012 16:50:23 ******/ 
ALTER TABLE [dbo].[CM_FULFILLMENT_HISTORY] ADD CONSTRAINT [PK_CM_FULFILLMENT_HISTORY] PRIMARY KEY NONCLUSTERED 
(
    [pan] ASC, 
    [RequestCode] ASC, 
    [RequestDate] ASC 
)WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [GEMINI_12_Indx_FG] 

Я также могу сделать это с помощью внешних ключей.

Есть ли способ извлечь код (скрипт) из этих ограничений?

Благодаря

+0

Я не думаю, что он хранится в виде строки, значения хранятся в системных таблицах. В ограничениях гораздо меньше гибкости, поэтому их можно нормализовать. – JNK

+0

Пожалуйста, ознакомьтесь с этим вопросом - мой ответ посвящен изучению нескольких различных зависимостей, включая внешние ключи. Как отмечали другие, SQL Server не хранит сценарий «ALTER TABLE» где угодно. http://stackoverflow.com/questions/6557038/find-tables-that-a-particular-table-depends-on-in-sql-server –

ответ

0

Я нашел скрипт, который делает трюк.

Declare  @dbname varchar(128) 
      , @tablename varchar(128) 
      , @query nvarchar(4000) 


select @dbname = 'gemini' 
     , @tablename = 'cm_fulfillment_house' 


SET @QUERY = 
'USE ' + @DBNAME + ' 


SELECT CAST(F.NAME AS VARCHAR(255)) AS ForeignKeyName, 
CAST(c.name as varchar(255)) AS ForeignTable, 
CAST(fc.name as varchar(255)) AS ForeignColumn, 
cast(fc2.name as varchar(255)) as ForeignColumn2, 
CAST(p.name as varchar(255)) AS PrimaryTable, 
CAST(rc.name as varchar(255)) AS PrimaryColumn, 
cast(rc2.name as varchar(255)) as PrimaryColumn2 
INTO #GetFKConstraints 
FROM SYSOBJECTS F 
INNER JOIN SYSOBJECTS C ON F.PARENT_OBJ = C.ID 
INNER JOIN SYSREFERENCES R on F.ID = R.CONSTID 
INNER JOIN SYSOBJECTS P ON R.RKEYID = P.ID 
INNER JOIN SYSCOLUMNS RC ON R.RKEYID = RC.ID AND R.RKEY1 = RC.COLID 
INNER JOIN SYSCOLUMNS FC ON R.FKEYID = FC.ID AND R.FKEY1 = FC.COLID 
left join syscolumns rc2 on r.rkeyid = rc2.id and r.rkey2 = rc.colid 
left join syscolumns fc2 on r.fkeyid = fc2.id and r.fkey2 = fc.colid 
WHERE F.TYPE = '+'''F'''+'' 

select @query = @query + ' and c.name = ''' + @tablename + '''' 

+ ' 

--SELECT * from #GetFKConstraints'+' 

SELECT ' + '''ALTER TABLE ''' + '+ ForeignTable + ' + ''' 
DROP CONSTRAINT ''' + '+ ForeignKeyName 
FROM #GetFKConstraints 
ORDER BY ForeignTable' 
+' 

SELECT ' + '''ALTER TABLE ''' + '+ ForeignTable +' + ''' 
ADD CONSTRAINT ''' + '+ ForeignKeyName +' 
+ ''' FOREIGN KEY ('''+ ' + ForeignColumn + '+ ''') 
REFERENCES ''' + '+ PrimaryTable + ' + '''(''' + '+ PrimaryColumn + '+ ''')''' + 
'FROM #GetFKConstraints 
ORDER BY ForeignTable 
' 
select @query 

EXEC (@QUERY) 
GO 
1

Как я могу получить код для конкретного внешнего ключа?

Этого не может быть, потому что его не существует. Конфигурации ключевых слов Forein и информация управления хранятся в таблицах, но нет «кода», который запускается.

Если вы посмотрите на INFORMATION_SCHEMA, вы обнаружите, что вы можете узнать, какие существуют ограничения и на что они ссылаются. Но нет «кода». Когда вы создаете ограничение внешнего ключа, записи конфигурации записываются в таблицу с ограничениями, описывающими ограничение. FK constriaint не является хранимой процедурой.

1

Взгляните на sys.foreign_keys и sys.foreign_key_columns. Первый расскажет вам, какие внешние ключи находятся в столбце, а последний скажет вам, в каких столбцах находятся внешние ключи.

Смежные вопросы