SQL SMO:查找依赖于函数的默认约束

时间:2014-07-17 21:54:19

标签: sql sql-server sql-server-2008 smo

下面的脚本改变了函数[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"脚本/依赖项发现"以编程方式生成此脚本。功能,如何识别依赖于该功能的所有默认约束?

1 个答案:

答案 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;

        }
    }
}