Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在SQLServer2005中从表中删除任何行时的反应方式_Sql Server 2005 - Fatal编程技术网

Sql server 2005 在SQLServer2005中从表中删除任何行时的反应方式

Sql server 2005 在SQLServer2005中从表中删除任何行时的反应方式,sql-server-2005,Sql Server 2005,在我们的数据库中,当然有很多表。我们的数据库中有一个表,比如说文件。此表包含与每个表相关的所有文件(如人员、联系人等)的列表。现在文件表中有一列父记录,在数据库级别存储父记录键而不是外键,因为同一列不可能与多个表中的人员或联系人相关。现在我想在一个地方创建一些数据库级别的东西,我们已经从联系人中删除了行,所以删除联系人中的所有行 在每个表上创建触发器的一种方法,但我们有数百个表。 我们不能使用级联删除,因为关系不是外键。 我们无法更改表的结构,因为我们获得了现有数据 谢谢,pst建议的方法本质上

在我们的数据库中,当然有很多表。我们的数据库中有一个表,比如说文件。此表包含与每个表相关的所有文件(如人员、联系人等)的列表。现在文件表中有一列父记录,在数据库级别存储父记录键而不是外键,因为同一列不可能与多个表中的人员或联系人相关。现在我想在一个地方创建一些数据库级别的东西,我们已经从联系人中删除了行,所以删除联系人中的所有行

在每个表上创建触发器的一种方法,但我们有数百个表。 我们不能使用级联删除,因为关系不是外键。 我们无法更改表的结构,因为我们获得了现有数据


谢谢,

pst建议的方法本质上是一种垃圾收集方法,可能比触发器的使用更受欢迎。由于不知道系统的总体特征,如果响应性更重要,这种方法不会增加删除给定记录的时间。换句话说,拥有未引用资源的风险小于减慢删除步骤的风险

此示例代码将循环遍历具有标识的表,并删除集中式“资源”表中该表的任何孤立项

假设:

每个父表都有一个标识列 资源表“files”以某种方式标识了可以找到其父表的表。例如,此示例具有硬编码的“TableName”列 发布在Microsoft脚本中心


无关系=:我知道的唯一其他数据库级选项是。。触发器。如果触发代码的大部分是相同的,例如,唯一改变的是表,它可以自动生成。另一个选项是运行清理作业,该作业将定期运行并执行某些维护任务,例如删除孤立记录。
DECLARE @ResourceTableName sysname
SET @ResourceTableName = 'Resource'

--cursor variables
DECLARE @sql nvarchar(max)

DECLARE @primarySchema sysname
DECLARE @primaryTableName sysname
DECLARE @identityColumnName sysname

DECLARE curTableName CURSOR LOCAL FAST_FORWARD READ_ONLY FOR 
SELECT table_schema, table_name, column_name
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMNPROPERTY(object_id(TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
AND table_name <> @ResourceTableName

-- loop through tables
OPEN curTableName

FETCH NEXT FROM curTableName
INTO @primarySchema, @primaryTableName, @identityColumnName
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @sql = '
        DELETE --SELECT *
        FROM ' + @ResourceTableName + '
        WHERE TableName = ''' + @primaryTableName + '''
        AND ParentID NOT IN (
            SELECT ' + @identityColumnName + ' FROM  ' +  @primarySchema + '.' + @primaryTableName + '
        )'

    --PRINT @sql
    EXEC sp_ExecuteSQL @sql

    FETCH NEXT FROM curTableName
    INTO @primarySchema, @primaryTableName, @identityColumnName
END

-- close a cursor
CLOSE curTableName
DEALLOCATE curTableName