How to create trigger after alter table that makes copy of added column with suffix _vis to another table?

huangapple go评论100阅读模式
英文:

How to create trigger after alter table that makes copy of added column with suffix _vis to another table?

问题

你好,我感到非常困惑,因为我不经常编写SQL代码,

我有两个表,一个是Subproject,另一个是SubprojectVisibilitySettings

表中的示例列

Subproject表 - SubprojectId | SubprojectName | SubprojectType

SubprojectVisibilitySettings表 - UserName | SubprojectId_vis | SubprojectName_Vis | SubprojectType_Vis

我需要创建一个触发器,检查是否向Subproject表添加了新列,如果是的话,还需要将具有相同名称+后缀 "_Vis" 的列添加到SubprojectVisibilitySettings表中。

预期结果

Subproject表 - SubprojectId | SubprojectName | SubprojectType | SubprojectDate

SubprojectVisibilitySettings表 - UserName | SubprojectId_vis | SubprojectName_Vis | SubprojectType_Vis | SuprojectDate_Vis

如果有人能帮助我解决这个问题,我将不胜感激。

英文:

Hello I feel really stuck because i don't code in SQL that often,

I have two tables one is Subproject and SubprojectVisibilitySettings

Example columns in tables

Table Subproject - SubprojectId | SubprojectName | SubprojectType

Table SubprojectVisibilitySettings - UserName | SubprojectId_vis | SubprojectName_Vis | SubprojectType_Vis

I need to make a trigger that checks if new column was added to Subproject table if yes then also add the column with the same name + suffix "_Vis" to table SubprojectVisibilitySettings table.

Expected result

Table Subproject - SubprojectId | SubprojectName | SubprojectType | SubprojectDate

Table SubprojectVisibilitySettings - UserName | SubprojectId_vis | SubprojectName_Vis | SubprojectType_Vis | SuprojectDate_Vis

If someone would help me to solve this I would be really thankful.

答案1

得分: 1

我找到了一种满足我的需求的创建触发器的方法,不知道是否是一个好的解决方案,但对我来说有效。所以如果有人和我一样遇到困难,可以尝试这个。

创建触发器

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. CREATE TRIGGER [AddColumnTrigger]
  6. ON DATABASE
  7. FOR ALTER_TABLE
  8. AS
  9. BEGIN
  10. -- 检查目标表是否为Subproject
  11. IF EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(128)') = 'Subproject'
  12. BEGIN
  13. DECLARE @columnName NVARCHAR(128) -- 新添加的列名
  14. SELECT TOP 1 @columnName = COLUMN_NAME
  15. FROM INFORMATION_SCHEMA.COLUMNS
  16. WHERE TABLE_NAME = 'Subproject'
  17. AND COLUMN_NAME NOT IN (
  18. SELECT REPLACE(name, '_Vis', '')
  19. FROM sys.columns
  20. WHERE object_id = OBJECT_ID('SubprojectVisibility')
  21. )
  22. ORDER BY ORDINAL_POSITION DESC
  23. -- 检查列是否存在且不存在于SubprojectVisibility
  24. IF @columnName IS NOT NULL AND NOT EXISTS (
  25. SELECT 1
  26. FROM sys.columns
  27. WHERE object_id = OBJECT_ID('SubprojectVisibility')
  28. AND name = @columnName + '_Vis'
  29. )
  30. BEGIN
  31. DECLARE @sql NVARCHAR(MAX)
  32. SET @sql = N'
  33. ALTER TABLE SubprojectVisibility
  34. ADD ' + QUOTENAME(@columnName + '_Vis') + ' TINYINT NOT NULL DEFAULT (0);
  35. ';
  36. -- 用所需的数据类型和值替换TINYINT
  37. EXEC sp_executesql @sql
  38. END
  39. END
  40. END
  41. GO
  42. ENABLE TRIGGER [AddColumnTrigger] ON DATABASE
  43. GO

修改表Subproject以添加新列

  1. ALTER TABLE dbo.Subproject
  2. ADD NewExampleColumn int;

结果

  1. Subproject
  2. SubprojectId | SubprojectName | NewExampleColumn
  3. SubprojectVisibility
  4. SubprojectId_vis | SubprojectName_Vis | NewExampleColumn_Vis
英文:

I found one way to create trigger for my needs I don't know if its good solution but works for me. So if someone struggles like me just try this.

Creating the trigger

  1. SET ANSI_NULLS ON
  2. GO
  3. SET QUOTED_IDENTIFIER ON
  4. GO
  5. CREATE TRIGGER [AddColumnTrigger]
  6. ON DATABASE
  7. FOR ALTER_TABLE
  8. AS
  9. BEGIN
  10. -- Check if the target table is Subproject
  11. IF EVENTDATA().value('(/EVENT_INSTANCE/ObjectName)[1]', 'NVARCHAR(128)') = 'Subproject'
  12. BEGIN
  13. DECLARE @columnName NVARCHAR(128) -- the added column name
  14. SELECT TOP 1 @columnName = COLUMN_NAME
  15. FROM INFORMATION_SCHEMA.COLUMNS
  16. WHERE TABLE_NAME = 'Subproject'
  17. AND COLUMN_NAME NOT IN (
  18. SELECT REPLACE(name, '_Vis', '')
  19. FROM sys.columns
  20. WHERE object_id = OBJECT_ID('SubprojectVisibility')
  21. )
  22. ORDER BY ORDINAL_POSITION DESC
  23. -- Check if the column exists and is not present in SubprojectVisibility
  24. IF @columnName IS NOT NULL AND NOT EXISTS (
  25. SELECT 1
  26. FROM sys.columns
  27. WHERE object_id = OBJECT_ID('SubprojectVisibility')
  28. AND name = @columnName + '_Vis'
  29. )
  30. BEGIN
  31. DECLARE @sql NVARCHAR(MAX)
  32. SET @sql = N'
  33. ALTER TABLE SubprojectVisibility
  34. ADD ' + QUOTENAME(@columnName + '_Vis') + ' TINYINT NOT NULL DEFAULT (0);
  35. '
  36. -- replace TINYINT with desired dataType and value
  37. EXEC sp_executesql @sql
  38. END
  39. END
  40. END
  41. GO
  42. ENABLE TRIGGER [AddColumnTrigger] ON DATABASE
  43. GO

Alter table Subproject adding new column

  1. ALTER TABLE dbo.Subproject
  2. ADD NewExampleColumn int;

The result

  1. Subproject
  2. SubprojectId | SubprojectName | NewExampleColumn
  3. SubprojectVisibility
  4. SubprojectId_vis | SubprojectName_Vis | NewExampleColumn_Vis

huangapple
  • 本文由 发表于 2023年7月6日 22:15:11
  • 转载请务必保留本文链接:https://go.coder-hub.com/76629766.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定