下面的脚本改变了函数[dbo]。[RetrieveDefaultValueForColumn1]。但是,由于此函数在两个表(表1和表2)中用作Column1的默认值,因此必须临时删除并重新添加这些默认约束。像这样:
-- drop dependent default constraints
ALTER TABLE [dbo].[Table1] DROP CONSTRAINT [DF_Table1_Column1];
GO
ALTER TABLE [dbo].[Table2] DROP CONSTRAINT [DF_Table2_Column1];
GO
-- alter function
ALTER FUNCTION [dbo].[RetrieveDefaultValueForColumn1] ()
RETURNS SMALLINT
AS
BEGIN
RETURN 1
END
GO
-- re-add dependent default constraints
ALTER TABLE [dbo].[Table1]
ADD CONSTRAINT [DF_Table1_Column1] DEFAULT ([dbo].[RetrieveDefaultValueForColumn1]()) FOR [Column1];
GO
ALTER TABLE [dbo].[Table2]
ADD CONSTRAINT [DF_Table2_Column1] DEFAULT ([dbo].[RetrieveDefaultValueForColumn1]()) FOR [Column1];
GO
如果我使用SQL SMO"脚本/依赖项发现"以编程方式生成此脚本。功能,如何识别依赖于该功能的所有默认约束?
答案 0 :(得分:0)
果然。在这里,PowerShell风格。请注意,我对已存在的文件并不小心。首先在测试环境中运行它,以确保不会破坏任何东西;它对我有用,但这并不意味着它会为你工作。无论如何,这个脚本将输出两个SQL脚本;一个删除约束,一个创建它们。
import-module sqlps;
$s = new-object microsoft.sqlserver.management.smo.server '.';
$db = $s.databases[ 'adventureworks2012' ];
$drop_options = new-object microsoft.sqlserver.management.smo.scriptingoptions;
$create_options = new-object microsoft.sqlserver.management.smo.scriptingoptions;
$drop_options.filename = 'c:\temp\default_drops.sql';
$drop_options.tofileonly = $true;
$drop_options.scriptdrops = $true;
$drop_options.AppendToFile = $true;
$create_options.filename = 'c:\temp\default_creates.sql';
$create_options.tofileonly = $true;
$create_options.scriptdrops = $false;
$create_options.AppendToFile = $true;
foreach ( $table in $db.tables ) {
foreach ( $column in $table.columns ) {
if ( $column.defaultconstraint.Text -eq '(getdate())' ) {
$column.defaultconstraint.script( $drop_options );
$column.defaultconstraint.script( $create_options );
$column | select parent, name, defaultConstraint;
}
}
}