Ste*_*ger 6 sql t-sql sql-server sql-server-2005 sql-server-2008-r2
问题:
在我们的SQL-Server 2005数据库中,我们有一个表T_Groups.
除其他外,T_Groups还包括字段ID(PK)和名称.
现在我们公司的一些白痴使用名称作为映射表中的键...
这意味着现在可能不会改变组名,因为如果有的话,映射就会消失......
现在,直到这个问题得到解决,我需要要向T_Groups添加限制,因此无法更新组的名称.
请注意,仍然可以插入,并且还应该可以进行不更改组名的更新.
另请注意,应用程序的用户和开发人员都拥有dbo和sysadmin权限,因此REVOKE/DENY将无法正常工作.
如何使用触发器执行此操作?
Ale*_*nko 13
CREATE TRIGGER dbo.yournametrigger ON T_Groups
FOR UPDATE
AS
BEGIN
IF UPDATE(name)
BEGIN
ROLLBACK
RAISERROR('Changes column name not allowed', 16, 1);
END
ELSE
BEGIN
--possible update that doesn't change the groupname
END
END
Run Code Online (Sandbox Code Playgroud)
CREATE TRIGGER tg_name_me
ON tbl_name
INSTEAD OF UPDATE
AS
IF EXISTS (
SELECT *
FROM INSERTED I
JOIN DELETED D ON D.PK = I.PK AND ISNULL(D.name,I.name+'.') <> ISNULL(I.name,D.name+'.')
)
RAISERROR('Changes to the name in table tbl_name are NOT allowed', 16,1);
GO
Run Code Online (Sandbox Code Playgroud)
根据您访问数据库的应用程序框架,检查更改的更便宜的方法是Alexander的答案.某些框架将生成包含所有列的SQL更新语句,即使它们没有更改,例如
UPDATE TBL
SET name = 'abc', -- unchanged
col2 = null, -- changed
... etc all columns
Run Code Online (Sandbox Code Playgroud)
该UPDATE()函数仅检查语句中是否存在列,而不是其值是否已更改.此特定语句将引发错误,UPDATE()但如果使用如上所示的更精细的触发器进行测试则不会.
| 归档时间: |
|
| 查看次数: |
9435 次 |
| 最近记录: |