itz*_*Paz -5 foreign-key sql-server metadata sql-server-2012 dependencies
我想将表列的数据类型从varchar(x)
更改为varchar(y)
。
为此,我需要知道此列有哪些依赖项。
有什么建议?
SQL Server 元数据之外的很多东西可能取决于列的大小,甚至都不好笑。以下是您需要检查的一些事项:
IN
、NOT IN
、EXISTS
、NOT EXISTS
、EXCEPT
、UNION
、 等的任何相关列。LEFT(some_string, old_length)
.我将假定您的varchar(x)
列不是键并且未声明为唯一的(如果是,您还可以检查sys.foreign_keys
对它们的任何引用)。
请注意,如果您使列更大,则当前假定旧长度的任何代码可能仍然可以正常工作而不会出错。假设 X 是 10,Y 是 20。假设 10 的旧代码可能会这样说:
DECLARE @foo VARCHAR(10) = '01234567890123456789';
PRINT @foo;
Run Code Online (Sandbox Code Playgroud)
结果:
0123456789
Run Code Online (Sandbox Code Playgroud)
无声截断,没有错误。同样的:
CREATE PROCEDURE dbo.foo
@foo VARCHAR(20) -- correct length
AS
BEGIN
SET NOCOUNT ON;
DECLARE @variable VARCHAR(10); -- old length
SET @variable = @foo;
PRINT @variable;
END
GO
Run Code Online (Sandbox Code Playgroud)
抱歉,没有什么神奇的查询可以为您收集所有这些内容。您将需要手动检查引用此表的任何代码。至少在 SQL Server 存储过程中,这应该很容易:
SELECT [schema] = s.name, [object] = o.name, o.[type_desc]
FROM sys.objects AS o
INNER JOIN sys.schemas AS s
ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.sql_expression_dependencies AS d
ON o.[object_id] = d.referencing_id
WHERE d.referenced_schema_name = N'dbo'
AND d.referenced_entity_name = N'table_that_contains_this_column';
Run Code Online (Sandbox Code Playgroud)
这完全忽略了应用程序代码,以及使用动态 SQL 构建的任何代码,以及间接基于该列的任何代码。不要忘记 SSIS 包、SSRS 报告等,它们也可能对这个长度进行了硬编码。
归档时间: |
|
查看次数: |
511 次 |
最近记录: |